8bit透過PNGを書き出すと劣化?する
最後にソースを記載しますが、やりたいことは
8bitの透過PNG画像を複数枚読み込み、重ねた1枚の画像を出力する、ということなのですが、どうにも画質が劣化?してしまって解決法が見出せずにいます。
以下のソースで読み込んでいるPNG画像は8bitの透過PNG画像で、BufferedImage.TYPE_BYTE_INDEXEDのBufferedImageに書きだして保存しているだけ(のつもり)です。
それだけで読み込んだもの、書きだしたものの品質が大きく違ってしまっています。
Javaで画像を扱ったことがほとんど無いので、そもそもTYPE_BYTE_INDEXEDを使うとそういう結果になるのは仕方のないことなのか、というのもわかりません。
ちなみにTYPE_4BYTE_ABGRを使うと劣化なく出力されますが、32bitなので。。。
どうにか読んだ8bit透過PNG画像をそのままの品質で書きだす方法はないものでしょうか?
アドバイスをお願いいたします。。
※添付画像は左側が下記ソース中のsrc.pngにあたるもの、右側がdest.pngにあたるものです。
画像添付がjpegしかできなかったので透過していませんが、円形以外の白色部分は実際には透過しています。
-以下ソースです--------------------
public class ImageTest {
public static void main() {
BufferedImage pileupImg = null;
try {
pileupImg = ImageIO.read(new File("C:/src.png"));
} catch (IOException e) {
return;
}
PixelGrabber pg = new PixelGrabber(pileupImg, 0, 0, -1, -1, true);
try {
pg.grabPixels();
} catch (InterruptedException e){}
Image img = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(256, 256, (int[])pg.getPixels(), 0, 256));
BufferedImage bi = new BufferedImage(256, 256, BufferedImage.TYPE_BYTE_INDEXED, (IndexColorModel)pileupImg.getColorModel());
Graphics g = bi.getGraphics();
g.drawImage(img, 0, 0, null);
try {
ImageIO.write(bi, "png", new File("C:/dest.png"));
} catch (IOException e) {}
return;
}
}
補足
ご回答ありがとうございます。 ちなみにバージョンはCS2です。 回答いただいた方法を試してみましたが、ファイルブラウザで確認してもやはり8bitのままで、2bitにはなっておりませんでした。 また、今回は2bit(4色)へのコンバートとなります。 やはり、photoshopではだめなのですかねえ。