V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LeeReamond
V2EX  ›  问与答

如何判断 png 图片是否存在 alpha 通道?

  •  
  •   LeeReamond · 59 天前 · 830 次点击
    这是一个创建于 59 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,有两张大小都为 1920*1080 的图,一张是手机拍摄的照片,一张是 ps 抠图后有空白部分的图片,如何识别哪张有镂空的部分?

    8 条回复    2021-10-12 23:34:38 +08:00
    ysc3839
        1
    ysc3839  
       59 天前 via Android
    先读头部信息判断是否是 32 位色,是的话解码位图遍历一遍 alpha 通道,看是否都为 255 。
    非 RGB 色彩空间的我就不懂了。
    ysc3839
        2
    ysc3839  
       59 天前 via Android
    @ysc3839 另外这方案只考虑了 8bit pixel 的情况,10bit 的我也不太了解。
    yzwduck
        3
    yzwduck  
       58 天前   ❤️ 8
    PNG 文件头里的 IHDR 里有个字段叫 Colour type,只有 Greyscale with alpha 或者 Truecolor with alpha 时,图片才有 alpha 通道。
    细节可以查 Portable Network Graphics (PNG) Specification 。
    如果不想看文档的话,读取 PNG 文件第 0x19 字节,如果它是 4 或者 6,则 PNG 有 alpha 通道。
    LeeReamond
        4
    LeeReamond  
    OP
       56 天前
    @yzwduck 带佬,言简意赅
    LeeReamond
        5
    LeeReamond  
    OP
       56 天前
    @yzwduck 不过试了试发现不管什么图片 0x19 一律都是 6,它可能有一个空的 alpha 通道。。有什么其他办法识别吗..
    yzwduck
        6
    yzwduck  
       56 天前   ❤️ 1
    @LeeReamond 如果要识别空 alpha 通道,只能用 1 楼的方法了。
    PNG 只支持 RGB 色彩空间,并且 Truecolour with alpha 只支持 8 或 16 位深,不会出现 1 楼讲的其他情况的。
    LeeReamond
        7
    LeeReamond  
    OP
       56 天前
    @yzwduck 带佬熟悉 webp 吗,这个格式有透明通道校验位之类的东西吗?我刚才发现图包里前面部分是 png,后面部分虽然扩展名是 png,但是二进制打开以后发现文件头是 RIFF:=WEBPVP8X....
    yzwduck
        8
    yzwduck  
       56 天前
    @LeeReamond 对 WebP 不熟,https://developers.google.com/speed/webp/docs/riff_container 讲了容器的格式,里面提到了 VP8X 里有 Alpha (L) flag,但我手边没有测试用的文件。

    补充 3 楼:如果 PNG 文件第 0x19 字节不是 4 或 6,还要检查是否存在 tRNS 段,它也能带上 alpha 通道信息(较少见)。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1075 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 21:55 · PVG 05:55 · LAX 13:55 · JFK 16:55
    ♥ Do have faith in what you're doing.