在最近的比赛中,我被赋予了从PNG图像文件的alpha通道中提取二进制数据(另一个PNG)的任务。数据的编码方式是,如果我从左上角的每个像素(例如80,78,71,13,10,26,10
)读取alpha通道中的值直到特定点,则生成的数据将形成另一个图像。是否可以检索0-255范围内的PNG文件的像素的Alpha值?
最初我试图用PHP完成这个任务,但是我碰到了一个我无法克服的障碍。考虑下面的代码:
function pad($hex){
return strlen($hex) < 2 ? "0$hex" : $hex;
}
$channel = '';
$image = 'image.png';
$ir = imagecreatefrompng($image);
imagesavealpha($ir, true);
list($width, $height) = getimagesize($image);
for ($y = 0; $y < $height; $y++){
for ($x = 0; $x < $width; $x++){
$pixel = imagecolorat($ir, $x, $y);
$colors = imagecolorsforindex($ir, $pixel);
$a = pad(dechex($colors['alpha']));
$channel.= $a;
}
}
运行在此之后,我注意到输出不包含PNG神奇的数字,我只是不知道哪里出了问题。经过一番挖掘,我发现$colors['alpha']
只包含小于或等于127的值。由于数据已经在编码0-255范围内,所以我找不到解压缩它的方法,最后(成功)改为用node.js解决问题。
所以,我的问题是:是否有任何方式我能读会中,而不是0-127,或者是这是一个硬一个0到255范围内有返回值的PNG文件的alpha通道PHP和/或GD的编码限制?
为了记录,我试图使用($colors['alpha']/127)*255
为了尝试伪造错误范围内的值到正确的值,但无济于事。
这GD值得注意的是有趣@wizard因为我在一块的代码中使用ImageColorAt并奇怪我为什么不得到确切的结果。稍后我会尝试Imagemagick版本,看看我得到了什么。当我写它时,Imagick不可用,使用ImageColorAt比使用exec()的Imagemagick调用更容易。我想我应该更新我的代码,因为自从我编写代码以来,已经发生了很多变化! – Bonzo
我实际上遍历了错误的图像,所以这个解决方案一开始并不起作用,但是修复了'for'循环之后,脚本正好返回了我所需要的。谢谢你的答案。 – SeinopSys
尝试关闭imagealphablending。 '$ img = imagecreatefrompng('image.png');' 'imagealphablending($ img,false);' 'imagesavealpha($ img,true); ' –