【问题标题】:Create a true grayscale PNG in PHP在 PHP 中创建一个真正的灰度 PNG
【发布时间】:2012-09-09 19:03:30
【问题描述】:

我需要在 PHP 中创建灰度图像。我不是在谈论在其调色板中具有灰度值的索引图像,而是在谈论 TRUE 灰度图像。区别在于PNG的第26个字节(颜色类型):

0 - greyscale  <-- THIS IS WHAT I NEED
2 - RGB
3 - RGB with palette
4 - greyscale + alpha
6 - RGB + alpha

(详见How to check a PNG for grayscale/alpha color type?

我尝试了imagefilter($im, IMG_FILTER_GRAYSCALE);imagetruecolortopalette($im, false, 255);,但我得到的只是 RGB 灰度图像(颜色类型 2)或带有灰度调色板的 RGB 调色板图像(颜色类型 3)。我还尝试使用imagecreate() 而不是imagecreatetruecolor() 来初始化图像,但这只会导致调色板图像。

有没有办法使用 PHP 的 GD 函数(或 PHP 中的任何其他函数)创建颜色类型为 0 的灰度 PNG?

这里有一些不同灰度图像的样本来说明我的意思。它们看起来都一样,但是如果您在 PhotoShop 中打开它们并查看图像 -> 模式设置,您会发现不同之处。十六进制编辑器也会显示第 26 个字节的差异:

RGB,颜色类型 2,3149 字节
RGB 调色板,颜色类型 3,3971 字节
True灰度图像,颜色类型 0,1105 字节


更新 01:

这是我用来创建 PNG 的基本代码。注释行是我尝试过的替代方法:

//$im = imagecreate($image_size, $image_size);
$im = imagecreatetruecolor($image_size, $image_size);

//imagefilter($im, IMG_FILTER_GRAYSCALE);
//imagetruecolortopalette($im, false, 255);

imagepng($im, $imgPathName);
imagedestroy($im);

【问题讨论】:

  • 到目前为止你的代码看起来怎么样?
  • @Breezer:请参阅我的 OP 中的“更新 01”。
  • 我猜你正在寻找php.net/manual/en/function.imagecolorallocate.php我认为本教程将帮助你一路走来,php.about.com/od/gdlibrary/ss/grayscale_gd.htm
  • 用 imagecolorallocate 定义要使用的颜色,基本上是调色板
  • 对不起,Breezer,但你已经走了。正如我明确指出的,我不想创建调色板图像,而是 8 位灰度图像。它与调色板无关。它类似于 RGB 图像,但只有一个颜色通道而不是三个通道。

标签: php png rgb grayscale gdlib


【解决方案1】:

GD 库不支持转换为“真实”灰度。它仅支持 RGB 和 TrueColor*。

有没有办法使用 PHP 的 GD 函数(或 PHP 中的任何其他函数)创建颜色类型为 0 的灰度 PNG?

ImageMagick 就是你要找的东西。

$im = new Imagick();
$im->readImage('file.png');
$im->setImageType(Imagick::IMGTYPE_GRAYSCALE);
$im->writeImage('file.gray.png');

【讨论】:

  • @Xeoncross 来自源 bitbucket.org/pierrejoye/gd-libgd/src - 仅支持 RGB 和 TrueColor* 输出。
  • @h0tw1r3:就是这样 - 谢谢!附带说明:只要我可以访问目标机器上的 GraphicsMagick,我就发誓不再使用 ImageMagick。幸运的是,如果您将 Imagick 替换为 Gmagick(并安装 GraphicsMagick PHP 扩展),h0tw1r3 的代码将与 GM 完美配合。
  • 我发现 Gmagick 和 Imagick PHP 扩展作为预编译的 Windows 版本很难找到。因此,以防万一该线程的任何读者会寻找 Windows 解决方案:更好地使用 shell 调用 IM/GM 可执行文件,如下所示:exec('gm mogrify -type grayscale "C:/path/to/your/file.png"');
猜你喜欢
  • 2015-11-04
  • 2017-02-13
  • 1970-01-01
  • 2011-09-25
  • 2015-12-11
  • 2011-01-09
  • 1970-01-01
  • 2012-02-07
  • 2010-12-02
相关资源
最近更新 更多