当前位置: 首页 > 知识库问答 >
问题:

在PHP中创建真正的灰度PNG

龚志
2023-03-14

我需要用PHP创建一个灰度图像。我说的不是调色板中有灰度值的索引图像,而是真正的灰度图像。不同之处在于PNG(颜色类型)的第26字节:

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

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

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

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

这里有一些不同灰度图像的样本来说明我的意思。它们看起来都一样,但如果你在PhotoShop中打开它们并查看图像-


更新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);

共有1个答案

孔彭祖
2023-03-14

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');
 类似资料:
  • 我是第一次使用openCV。我正在使用openCV3和XCode对其进行编码。我想创建一个16位的灰度图像,但我想我有的数据是这样定义的,4000是像素值为白色和0为黑色。我在int类型的数组中有这些像素的信息。如何创建Mat并将数组中的值分配给Mat?

  • 问题内容: 有谁知道用PHP创建文件上传进度条的任何方法吗?我经常听到这是不可能的。 我有一个主意,但不确定是否可行:上传正常文件,但提交至iframe。提交后,将文件信息(大小和临时位置)存储在会话中。同时,每隔10秒启动一次AJAX调用,以检查文件大小与会话中存储的大小。这会将大小返回给AJAX,然后将调整进度条的大小,并可能向用户显示上载的大小。 有什么想法吗? 问题答案: 您可以尝试使用Y

  • 我在Swift中创建了一个单例类,如下所示: 这允许我从任何地方访问共享实例: 虽然这是可行的,但它并没有使这个实例成为整个系统中唯一可能的实例,这就是单例的全部意义。 这意味着我仍然可以创建一个全新的实例,比如: 所以我的问题是:在Swift中是否有办法创建一个真正的单例类,其中只有一个实例可以在系统范围内实现?

  • 问题内容: 我听过关于此主题的不同回答,那么销毁PHP会话的肯定方法是什么? 在最简单的情况下,这是否足以真正终止用户与服务器之间的会话? 问题答案: 要销毁会话,您应该采取以下步骤: 删除会话数据 使会话ID无效 为此,我将使用以下代码: 为了确保会话ID无效,您应该只允许脚本启动的会话ID。因此,设置一个标志并检查它是否被设置: 此外,您可以使用此时间戳定期交换会话ID,以缩短其寿命:

  • 我无法理解BMP格式,我知道它应该很简单,但不知何故我遗漏了一些东西。我以为它是2个标题,后面是定义图像的实际字节,但数字加起来并不正确。 例如,我只是尝试将此BMP文件加载到内存(640x480 8bpp灰度)中,然后将其写回其他文件。据我所知,有两个不同的标头 BITMAPFILEHEADER 和 BITMAPINFOHEADER。BITMAPFILEHEADER是14个字节,BITMAPIN

  • 嗨,我是Android开发和使用Android Studio的新手。我需要创建*.aar lib。我创建了新的Android库项目(目前为空)。如何从中生成*.aar文件?你能按步骤解释吗?读过很多题目但还是不成功。多谢了。