用PHP创建一个真正的灰度PNG

Jps*_*psy 6 php rgb png gdlib grayscale

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

0 - greyscale  <-- THIS IS WHAT I NEED
2 - RGB
3 - RGB with palette
4 - greyscale + alpha
6 - RGB + alpha
Run Code Online (Sandbox Code Playgroud)

(有关详细信息,请参阅如何检查PNG的灰度/ alpha颜色类型?)

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

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

以下是一些不同灰度图像的样本,以显示我的意思.它们看起来都一样,但是如果你在PhotoShop中打开它们并查看图像 - >模式设置,你会看到差异.十六进制编辑器也会显示第26个字节的差异:

RGBRGB,颜色类型 2,31449字节
RGB调色板RGB调色板,颜色类型 3,3971字节
真正的灰度图像真灰度图像,颜色类型 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);
Run Code Online (Sandbox Code Playgroud)

h0t*_*1r3 6

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');
Run Code Online (Sandbox Code Playgroud)