【问题标题】:PHP raw 16bit colorPHP 原始 16 位颜色
【发布时间】:2013-03-14 09:54:35
【问题描述】:

有没有办法使用 PHP 将 16 位(灰度)彩色 PNG 转换为 RGBA4444 颜色格式?

-或-

有没有办法使用 RGBA4444 格式加载这个 16 位灰度 PNG?

PNG 标头表示它使用 16 位颜色(位深度)和灰度颜色(颜色类型)(http://www.fileformat.info/format/png/corion.htm,IHDR 图像标头)。

$rgb = imagecolorat($src, $x, $y);
var_dump("RGB - ".dechex($rgb));
$rgba = imagecolorsforindex($src, $rgb);
var_dump("RGBA - ".dechex($rgba));

$rgb 的值(例如)是A7$rgba 的值是[A7, A7, A7, 0]

顺便说一句,这里是上述文件的标题:

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 | .PNG........IHDR
00 00 03 FF 00 00 03 FF 10 00 00 00 00 E3 F9 FF | ................
C9 00 00 00 0D 74 45 58 74 44 46 4D 54 00 52 34 | .....tEXtDFMT.R4
47 34 42 34 41 34 E0 94 BA 92 00 00 20 00 49 44 | G4B4A4........ID
41 54 .. ..                                     | AT

编辑:

我首先做的是遵循查理 (https://stackoverflow.com/a/7293429/2205703) 的代码。 (当然有一些修改。)然后将每个16位颜色格式(基于tEXt块)转换为RGBA8888格式。

然后,pack() 将它们转换为 PNG 文件格式。但我仍然出现图像错误。

【问题讨论】:

  • 您可以简单地截断为 8 位颜色。为了获得更好的结果,您需要实现抖动,或使用为您执行此操作的库。

标签: php image-processing


【解决方案1】:

布拉德的回答还不错。对于灰度图像,截断到 8 位就足够了。 RGBA 将以透明图像结束,这可能不是您真正想要的。您是否已经尝试过转换为全彩色 24 位图像?结果仍然看起来像灰度,您可以轻松地将其降低到 8 位。

使用 imagick 会使这个过程更简单:

convert source-image.png -evaluate multiply 16 -depth 8 destination-image.png

【讨论】:

  • 我测试了这个imagick,但它仍然是灰度的。我认为它会将数据读取为 16 位灰度(如标题所述),然后将其转换为 8 位灰度。我期望将 16 位灰度读取为 r4g4b4a4(并且某些文件具有 a4r4g4b4)。但感谢您的回复
猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 2013-01-02
相关资源
最近更新 更多