【问题标题】:How to check a PNG for grayscale/alpha color type?如何检查 PNG 的灰度/alpha 颜色类型?
【发布时间】:2011-01-04 16:50:15
【问题描述】:

当使用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);

干杯,

阿隆

【问题讨论】:

  • 扭曲是什么意思?您需要采取某些步骤来保持 Alpha 透明度。但是灰度问题......这对我来说是新的
  • 我已经更新了我的示例以包含示例图像。保留 alpha 透明度很好。它是 GD 无法处理的具有透明度的灰度图像,请参阅下面 haim evgi 的答案。

标签: php png gd


【解决方案1】:

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

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

前面的字节(偏移量 24)给出了每个通道的位数。详情请见the PNG spec

通过一个 tRNS 块(当它是颜色类型 0 2 或 3 时),PNG 文件可能具有“1 位 alpha”(如 GIF)。

【讨论】:

    【解决方案2】:

    我今天来到这里寻找一种方法来判断(通过 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();
      }
    

    实际上我需要它来确保与 ie6 的向后兼容性 在 cms-user-generated-pages 中,将所有 alpha-png 标签 替换为 inline-block - 然后将提供 alpha-png 文件作为 ms 专有 css 属性 filter

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

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

    保罗

    【讨论】:

    • 使用 (bool) (ord(file_get_contents($alpha_png_candidate, NULL, NULL, 25, 1)) &amp; 4) 会告诉你是否有 alpha 通道,无论图像是灰度还是 rgb。
    【解决方案3】:

    看到这个答案 :

    对于那些使用 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

    【讨论】:

    • 谢谢,但是我正在寻找一种方法来检测图像是否具有透明度,然后再尝试使用imagecreatefrompng() 创建资源。这些图像已提交到该站点,因此不幸的是我无法将图像重新保存为 RBG(至少我不知道一种方法)。
    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    • 2014-04-06
    • 1970-01-01
    • 2021-06-23
    • 2015-04-22
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    相关资源
    最近更新 更多