質問: bi.getgraphics(); g.drawimage(img, 0, 0, null); try { imageio.write(bi, "png", new file("c:/dest.png")); } catch (ioexception e) {} return; } }
回答: type_byte_indexed というのどういう画像フォーマットだか、ご存じですね? 念の為に書いておくと、各画素を0から255までの色番号で表現し、各色番号がどんな色になるかを別途パレットで指定するものです。 その構成上、パレットに無い色は出せません。 使用されている色が256色までだったら、元の画像を再現できます。 それを越えると、表現できない色が出てきます。パレット中の近い色に置き換える、とか、タイルパターンやディザを使う、といった減色処理が必要になります。減色処理が悪いと、著しく劣化したように見えます。 添付画像を見た印象では、この減色処理の結果ではないか、と思われます。 インデックスカラー同士の合成、というのはいろいろと面倒です。 ・同じパレットでなければ、色番号の変更だけでは処理できず、一旦色にして、該当する合成先の色番号に変換する必要があります ・アルファチャンネルがあるとさらに複雑です。合成の結果、パレットに無い色が生れる可能性があります。 汎用にやろうとしたら「一旦フルカラーで処理→パレットにあうように減色」とするのが確実でしょう。drawimageの実装は調べてませんが、graphicsが汎用的に使われるクラスなので、おそらくこのような汎用的な処理をしているものと思われます。 このプログラムで言えば、途中の処理に使うbiはtype_4byte_abgrにして、書き出す直前に256色に減色→書き出しというのが常套手段と思われます。 javaでの減色方法は面倒なので調べてません。