2013-03-25 14 views
6

PHPを使用して16ビット(グレースケール)カラーPNGをRGBA4444カラーフォーマットに変換する方法はありますか?PHP raw 16bit color

-OR-

RGBA4444形式を使用して、この16ビットのグレースケールPNGをロードする方法はありますか?

PNGヘッダーは、16ビットカラー(ビット深度)とグレースケールカラー(カラータイプ)(http://www.fileformat.info/format/png/corion.htm、IHDRイメージヘッダー)を使用していることを示します。 $rgba[A7, A7, A7, 0]いる間

$rgb = imagecolorat($src, $x, $y); 
var_dump("RGB - ".dechex($rgb)); 
$rgba = imagecolorsforindex($src, $rgb); 
var_dump("RGBA - ".dechex($rgba)); 
$rgb

の値は、(例えば)A7あります。

ところで、ここで述べたファイルのヘッダは次のとおりです。

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 | .PNG........IHDR 
00 00 03 FF 00 00 03 FF 10 00 00 00 00 E3 F9 FF | ................ 
C9 00 00 00 0D 74 45 58 74 44 46 4D 54 00 52 34 | .....tEXtDFMT.R4 
47 34 42 34 41 34 E0 94 BA 92 00 00 20 00 49 44 | G4B4A4........ID 
41 54 .. ..          | AT 

編集:私は最初のチャーリー(https://stackoverflow.com/a/7293429/2205703)によって、このコードに従った何をしたか

。 (もちろん、いくつかの変更があります。)次に、16ビットカラーフォーマット(tEXtチャンクに基づく)をRGBA8888フォーマットに変換します。

次に、pack()をPNGファイル形式に変換します。しかし、私はまだ画像エラーがあります。

+0

あなたは単に8ビットカラーに切り捨てることができます。より良い結果を得るには、ディザリングを実装するか、これを行うライブラリを使用する必要があります。 – Brad

答えて

2

ブラッドの回答は悪くないです。 8ビットに切り詰めると、グレースケール画像で十分に機能します。 RGBAは、あなたが本当に探しているものではない透明な画像で終わるでしょう。あなたはすでにフルカラーの24ビットイメージに変換しようとしましたか?結果はまだグレイスケールのように見えますが、簡単に8ビットに減らすことができます。 imagickを使用して

は、この手順は非常に簡単になるだろう:

convert source-image.png -evaluate multiply 16 -depth 8 destination-image.png 
+0

私はこのイメージをテストしましたが、まだグレースケールです。私はそれが16ビットのグレースケール(ヘッダが言うように)としてデータを読み取り、それを8ビットのグレースケールに変換すると思います。私が期待するのは、r4g4b4a4として16ビットのグレースケールを読み込むことでした(そして、いくつかのファイルにはa4r4g4b4があります)。しかし、応答に感謝 – ReignBough