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

2021-10-10 04:11:36 +08:00
 LeeReamond

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

1877 次点击
所在节点    问与答
8 条回复
ysc3839
2021-10-10 05:08:16 +08:00
先读头部信息判断是否是 32 位色,是的话解码位图遍历一遍 alpha 通道,看是否都为 255 。
非 RGB 色彩空间的我就不懂了。
ysc3839
2021-10-10 05:10:20 +08:00
@ysc3839 另外这方案只考虑了 8bit pixel 的情况,10bit 的我也不太了解。
yzwduck
2021-10-10 08:36:33 +08:00
PNG 文件头里的 IHDR 里有个字段叫 Colour type,只有 Greyscale with alpha 或者 Truecolor with alpha 时,图片才有 alpha 通道。
细节可以查 Portable Network Graphics (PNG) Specification 。
如果不想看文档的话,读取 PNG 文件第 0x19 字节,如果它是 4 或者 6,则 PNG 有 alpha 通道。
LeeReamond
2021-10-12 15:53:06 +08:00
@yzwduck 带佬,言简意赅
LeeReamond
2021-10-12 16:50:34 +08:00
@yzwduck 不过试了试发现不管什么图片 0x19 一律都是 6,它可能有一个空的 alpha 通道。。有什么其他办法识别吗..
yzwduck
2021-10-12 19:55:36 +08:00
@LeeReamond 如果要识别空 alpha 通道,只能用 1 楼的方法了。
PNG 只支持 RGB 色彩空间,并且 Truecolour with alpha 只支持 8 或 16 位深,不会出现 1 楼讲的其他情况的。
LeeReamond
2021-10-12 22:51:43 +08:00
@yzwduck 带佬熟悉 webp 吗,这个格式有透明通道校验位之类的东西吗?我刚才发现图包里前面部分是 png,后面部分虽然扩展名是 png,但是二进制打开以后发现文件头是 RIFF:=WEBPVP8X....
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 通道信息(较少见)。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/806791

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX