如何检查PNG的灰度/ alpha颜色类型?

时间:2010-01-13 15:40:56

标签: php png gd

使用imagecreatefrompng()时,PHP和GD似乎无法使用alpha格式创建灰度类型的PNG图像。结果令人难以置信的扭曲。

我想知道是否有人知道测试颜色类型的方法,以便通知用户不兼容?

示例:

原始图片:http://dl.dropbox.com/u/246391/Robin.png
结果图片:http://dl.dropbox.com/u/246391/Robin_result.png

代码:

<?php

$resource = imagecreatefrompng('./Robin.png');
header('Content-type: image/png');
imagepng($resource);
imagedestroy($resource);

干杯,

阿隆

3 个答案:

答案 0 :(得分:9)

PNG图像的颜色类型存储在文件中的字节偏移25处(从0开始计数)。因此,如果您可以获得PNG文件的实际字节,只需查看字节25(我不做PHP,所以我不知道该怎么做):

  • 0 - greyscale
  • 2 - RGB
  • 3 - 带调色板的RGB
  • 4 - greyscale + alpha
  • 6 - RGB + alpha

前一个字节(偏移量24)给出每个通道的位数。有关详细信息,请参阅the PNG spec

稍微扭曲一下,PNG文件可能具有“1位alpha”(如GIF),具有tRNS块(当颜色类型为0 2或3时)。

答案 1 :(得分:5)

我今天来到这里寻找一种方法告诉(通过php)一个特定的.png图像是否是一个alpha-png图像 -
大卫琼斯的答案指向了正确的方向,在php中很容易实现:

file_get_contents 只加载那个25'字节(确实是!),然后是 ord()获取其ASCII值,进行测试(在我的情况下为“6”)

if(ord(file_get_contents($alpha_png_candidate, NULL, NULL, 25, 1)) == 6) {
  is_alpha_png_so_do_something();
  }

实际上我需要它来确保与ie6的向后兼容性 在cms-user-generated-pages中,替换所有 alpha-png&lt; img&gt; 内联块&lt;标签 spans&gt; - 然后将alpha-png文件作为 ms-proprietary css属性过滤器

的变量。
.alpha_png_span{
  filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(
    src='$alpha_png_candidate', sizingMethod='crop')
  }

......一切正常,谢谢!

答案 2 :(得分:0)

看到这个答案 :

使用ImageCreateFromPng的人的另一个有用的注意事项: PHP和GD无法识别灰度/ alpha图像。

因此,如果您使用透明度介于0%和100%之间的灰度图像,请将图像另存为RGB。

至少在PHP版本4.4.2-1和5.1.2-1中使用GIMP 2.2.8制作图片。

网址: http://php.net/manual/en/function.imagecreatefrompng.php