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

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

  •  
  •   LeeReamond · 2021-10-10 04:11:36 +08:00 · 1879 次点击
    这是一个创建于 1141 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    补充 3 楼:如果 PNG 文件第 0x19 字节不是 4 或 6,还要检查是否存在 tRNS 段,它也能带上 alpha 通道信息(较少见)。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2219 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:36 · PVG 09:36 · LAX 17:36 · JFK 20:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.