最近の大会では、PNG画像ファイルのアルファチャンネルからバイナリデータ(別のPNG)を抽出する作業が与えられました。データは、各ピクセルのアルファチャンネルの値を左上(たとえば80,78,71,13,10,26,10
)から特定のポイントまで読み取ると、結果のデータが別のイメージを形成するようにデータがエンコードされました。0-255の範囲のPNGファイルのピクセルのアルファ値を取得することは可能ですか?
最初は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の問題を解決します。
私はPNGファイルのアルファチャンネルを読み取ることができました。0〜255の範囲の値を0〜127の値に戻したのでしょうか、 PHPやGDのコード化された制限?
私は、正しくない範囲の値を正しいものにしようとしたが役に立たないようにするために、($colors['alpha']/127)*255
を使用しようとしました。
: コードを考えると、私は感じます正確な結果を得る。私はImagemagick版を後で試し、私が得たものを見ていきます。 Imagickは使用できませんでした。ImageColorAtを使用するのは、Imagemagickのexec()での呼び出しよりも簡単でした。私はそれを書いてからたくさんの変更があったので、私は自分のコードを更新すべきだと思います! – Bonzo
私は実際には画像を間違って走査していましたので、このソリューションは最初は機能しませんでしたが、 'for'ループを修正した後、スクリプトは必要なものを正確に返しました。答えてくれてありがとう。 – SeinopSys
imagealphablendingをオフにしてみます。 '$ img = imagecreatefrompng( 'image.png');' 'imagealphablending($ img、false);' 'imagesavealpha($ img、true); ' –