2016-12-10 12 views
1

最近の大会では、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を使用しようとしました。

答えて

2

GDの制限です。

GDはアルファチャンネル解像度の7ビットのみを有し、そして127は、不透明、透明 、0:https://bitbucket.org/libgd/gd-libgd/issues/132/history-behind-7-bit-alpha-componentによれば、GD源では言います。便利な瞬間、寿命は となります。

$image = new Imagick(__DIR__ . DIRECTORY_SEPARATOR . 'image.png'); 
$x = 300; 
$y = 490; 
$pixel = $image->getImagePixelColor($x, $y); 
$colors = $pixel->getColor(true); 
echo 'Alpha value: ' . round($colors['a'] * 255, 0); 

のImageMagick:あなたはImageMagickのPHP拡張モジュールをインストールする場合

、あなたはこのようなピクセル(のは、x = 300かつy = 490としましょう)のために0〜255の間でアルファ値を取得できます。 (Imagickと呼ばれる)PHPのためのhttps://www.imagemagick.org

のImageMagick:あなたのコードでhttp://php.net/manual/en/book.imagick.php

+0

: コードを考えると、私は感じます正確な結果を得る。私はImagemagick版を後で試し、私が得たものを見ていきます。 Imagickは使用できませんでした。ImageColorAtを使用するのは、Imagemagickのexec()での呼び出しよりも簡単でした。私はそれを書いてからたくさんの変更があったので、私は自分のコードを更新すべきだと思います! – Bonzo

+0

私は実際には画像を間違って走査していましたので、このソリューションは最初は機能しませんでしたが、 'for'ループを修正した後、スクリプトは必要なものを正確に返しました。答えてくれてありがとう。 – SeinopSys

+0

imagealphablendingをオフにしてみます。 '$ img = imagecreatefrompng( 'image.png');' 'imagealphablending($ img、false);' 'imagesavealpha($ img、true); ' –

-1

list($width, $height) = getimagesize($image); 
  • 変数 '$ image'はコードで定義されていません。
  • getimagesizeを使用すると、$ imageはファイル名です。
  • この行はファイル名から幅と高さを取得します。

私がテストしたときにこの行がコードを壊しました。 あなたはすでにあなたの答えを持っていますが、これは後世のためのものです。私はコードの一部でImageColorAtを使用して、私はしなかった理由を不思議に思っていますようGDノートが面白い@wizardされていることを

$width=imagesx ($ir); 
$height=imagesy ($ir); 

は、より論理的で(そして実際に動作する)だろう

+0

問題の実際のコードを整理したときにその問題が残っていましたが、今修正しました。 – SeinopSys

関連する問題