如何使用GD检查PNG图像是否具有透明度?
如何使用 PHP 的 GD 扩展检查 PNG 图像是否具有透明像素?
How do I check if a PNG image has transparent pixels using PHP's GD extension?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如何使用 PHP 的 GD 扩展检查 PNG 图像是否具有透明像素?
How do I check if a PNG image has transparent pixels using PHP's GD extension?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(8)
我知道这已经很旧了,但我刚刚在 PHP 文档的评论中发现了这一点。 (链接)
仅适用于 PNG 图像。
I know this is old, but I just found this on the comments of the PHP docs. (link)
Only works for PNG images though.
看起来似乎无法一眼看出透明度。
imagecolorat
手册页上的注释建议处理真彩色图像时得到的整数实际上总共可以移动四次,其中第四个是 Alpha 通道(其他三个是红色、绿色和蓝色)。因此,给定$x
和$y
处的任何像素位置,您可以使用以下方法检测 alpha:127 的
$alpha
显然是完全透明的,而零是完全不透明的。不幸的是,您可能需要处理图像中的每一个像素才能找到透明的像素,而这只适用于真彩色图像。否则
imagecolorat
返回一个颜色索引,您必须使用imagecolorsforindex
,它实际上返回一个带有 alpha 值的数组。It doesn't look like you can detect transparency at a glance.
The comments on the
imagecolorat
manual page suggest that the resulting integer when working with a true-color image can actually be shifted four times total, with the fourth being the alpha channel (the other three being red, green and blue). Therefore, given any pixel location at$x
and$y
, you can detect alpha using:An
$alpha
of 127 is apparently completely transparent, while zero is completely opaque.Unfortunately you might need to process every single pixel in the image just to find one that is transparent, and then this only works with true-color images. Otherwise
imagecolorat
returns a color index, which you must then look up usingimagecolorsforindex
, which actually returns an array with an alpha value.我知道这是一个旧线程,但在我看来它需要改进,因为通过检查所有像素来遍历一个巨大的 png 却发现它不透明是浪费时间。因此,经过一番谷歌搜索后,我发现 Jon Fox 的博客 和我在 W3C PNG 规范<的帮助下改进了他的代码/a> 进一步可靠、快速并具有最小的内存印记:
I know this is an old thread, but in my opinion it needs improvement since walking through a huge png by checking all pixels only to find out it is not transparent is a waste of time. So after some googleing I found Jon Fox's Blog and I improved his code with the help of the W3C PNG Specification further to be reliable, fast and have a minimum on memory imprint:
这是可以做到的!
我已将所有答案和评论合并到一个函数中,该函数应该是快速且可靠的。可靠的:
It can be done!
I've combined all answers and comments into one function which should be fast & reliable:
非常简单的forward函数,它会检查图像中是否有透明像素,如果有,则返回true。
Pretty strait forward function, it will check if there is any transparent pixel in the image, if it is, it will return true.
这就是我检测 8-32 位透明度的方法。它只适用于 PNG。
This is how I detect 8-32 bit transparency. It only work with PNG's.
cronoklee的功能很好,但是我在使用的时候发现了一个bug。它不适用于 8 位调色板的图像。这是固定的变体:
cronoklee's function is very good, but when I was using it I found a bug. It does not work for images with 8 bit pallet. Here is the fixed variant:
改进了cronoklee的功能。删除了每个像素不必要的位移位,减少了漏报计数,在功能描述中添加了解释。
用法:
Improved cronoklee's function. Removed unnecessary bit shifting for each pixel, reduced false negatives count, added explanation in function description.
Usage: