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

ac9*_*c94 7 php png gd

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

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

例:

原始图片: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);
Run Code Online (Sandbox Code Playgroud)

干杯,

阿隆

Dav*_*nes 9

PNG图像的颜色类型存储在文件中的字节偏移25处(从0开始计数).因此,如果你能掌握PNG文件的实际字节,只需查看字节25(我不做PHP,所以我不知道如何做到这一点):

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

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

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


小智 5

我今天登陆这里,寻找一种方法来(通过php告诉)特定的.png图像是否是alpha-png图像
-David Jones的答案指向了正确的方向,真的很容易在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();
  }
Run Code Online (Sandbox Code Playgroud)

实际上,为了确保与cms-user-generated-pages中的ie6向后兼容,我需要用 inline-block <spans>替换所有alpha-png <img>标签 -然后,alpha-png文件将用作 ms专有的CSS属性过滤器

.alpha_png_span{
  filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(
    src='$alpha_png_candidate', sizingMethod='crop')
  }
Run Code Online (Sandbox Code Playgroud)

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

保罗