在最近的比賽中,我被賦予了從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); ' –