PNG处理没有图像Magick和imagefrompng()

时间:2016-11-07 05:28:20

标签: php png rgb photoshop rgba

我需要将每种颜色的黄色变为蓝色,并将每种颜色的深灰色变为浅灰色的PNG图像中的透明度。

问题是:

我无法使用Photoshop,因为我有100张图片,而且我需要多次更改色调。 我不能使用Image Magick,因为我需要比'-fx'更复杂的计算。 我不能使用PHP imagefrompng(),因为这个讨厌的废话不适用于我的很多图像, 即使有所有建议的修复,例如:

$background = imagecolorallocate($png, 255, 255, 255);
// removing the black from the placeholder
imagecolortransparent($png, $background);
// turning off alpha blending (to ensure alpha channel information is preserved, rather than removed (blending with the rest of the image in the form of black))
imagealphablending($png, true);
// turning on alpha channel information saving (to ensure the full range of transparency is preserved)
imagesavealpha($png, true);

等等。它适用于某些图像,但不适用于其他图像。

我需要的只是一个PNG库(可能不是PHP),它可以给我坐标x,y处的像素的红色,绿色,蓝色和alpha分量,然后在我的计算后设置这个像素,例如:< / p>

$rgba = getrgba($image, $x, $y);
$rgba = my_function($rgba);
setrgba($image, $x, $y, $rgba);

也许您可以推荐其他语言的库,而不仅仅是PHP?

2 个答案:

答案 0 :(得分:0)

如果您不介意使用Python,请查看Pillow,特别是其PixelAccess课程。这些主题(12)应该会有所帮助并且有一些代码示例。

答案 1 :(得分:0)

方法1

如果您只想获得R,G,B和Alpha的原始像素值而不必担心压缩和编码,请使用 ImageMagick 将图像转换为纯文本,未压缩,未编码的二进制文件和阅读并按照你的内心处理它。

所以,如果我们用RGBA(0,64,255,0.5)制作一个1x1像素的PNG文件来测试:

convert -size 1x1 xc:"rgba(0,64,255,0.5)" a.png

现在我们可以让 ImageMagick 制作一个原始的RGBA文件,您可以根据自己的意愿阅读和处理您想要的任何语言,无论您希望的复杂程度如何:

convert a.png rgba:data.bin

现在我们可以查看该文件:

xxd data.bin

<强>结果

0000000: 0040 ff80                                .@..

在那里,您可以看到并读取所有RGBA像素。当你完成后,只需反过来取回一个PNG - 注意你必须首先告诉 ImageMagick 大小,因为它不知道这个:

convert -size 1x1 rgba:data.bin new.png

请注意, ImageMagick 是一个相当大的软件包,您可以使用更轻量级的vips软件包实现与上述相同的功能:

vips VipsForeignSaveRaw a.png data.rgb

方法2

或者,如果您希望数据为未压缩的,人类可读的ASCII,请使用PPM(便携式Pixmap)和PGM(Portable Greymap)的古老NetPBM格式 - 请参阅NetPBM on Wikipedia

制作4x1图像并写为PPM:

convert -size 4x1 xc:"rgba(0,64,255,0.1)" -compress none ppm:-
P3
4 1
65535
0 16448 65535 0 16448 65535 0 16448 65535 0 16448 65535

你可以看到4个重复的RGB值。如果您想将其作为文件,只需使用ppm:-更改最后的someFile.ppm

再次制作相同的图像,并将Alpha通道提取到单独的文件中:

convert -size 4x1 xc:"rgba(0,64,255,0.1)" -alpha extract -compress none pgm:-
P2
4 1
65535
6554 6554 6554 6554 

希望您可以看到65540.1,范围为0-65535。

如果您只想要上述任何一项的8位数据,请添加-depth 8

方法3

正如Glenn在评论中所建议的那样,另一种选择是省略选项2上的-compress none,它将为您提供一种非常相似的文件格式,除了像素数据将以二进制形式存在之后,标题保留在ASCII中。这通常更快更小。