Java の BufferedImage は getType() を使うことでタイプを知ることが出来ます。
グレースケールの場合は、BufferedImage.TYPE_BYTE_GRAY
インデックスカラーの場合は、BufferedImage.TYPE_BYTE_INDEXED になります。
グレースケールの画像を、 PixelGrabber 、又は ColorConvertOp を利用して
TYPE_INT_ARGB に変換させようと思うと、なぜか明るくなることがあります。
インデックスカラーの画像を TYPE_INT_ARGB に変換させる場合はそういうことはありません。
直にグレースケールから TYPE_INT_ARGB に変換してもいいのですが、
インデックスカラーへの変換方法について書きます。
インデックスカラーの BufferedImage の生成方法のサンプルにもなると思います。
static BufferedImage repairBufferedImage(BufferedImage image) {
Raster raster = image.getData();
int height = raster.getHeight();
int width = raster.getWidth();
int datasize = width * height;
final int GRAYSIZE = 256;
int[] color = new int[4];
byte[] pallet_grayscale = new byte[GRAYSIZE];
for (int i = 0; i < GRAYSIZE; i++) {
pallet_grayscale[i] = (byte) i;
}
IndexColorModel icm = new IndexColorModel(8, GRAYSIZE,
pallet_grayscale, pallet_grayscale, pallet_grayscale);
byte[] indexout = new byte[datasize];
int i = 0;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
raster.getPixel(x, y, color);
indexout[i] = (byte) color[0];
i++;
}
}
BufferedImage out = new BufferedImage(width, height,
BufferedImage.TYPE_BYTE_INDEXED, icm);
Graphics g = out.createGraphics();
g.drawImage(Toolkit.getDefaultToolkit().createImage(
new MemoryImageSource(width, height, icm, indexout, 0, width)),
0, 0, null);
g.dispose();
g = null;
return (out);
}
以上です。




コメント
[…] 「BufferedImage」の TYPE_4BYTE_ABGR から TYPE_INT_ARGB にする方法 「BufferedImage」の TYPE_BYTE_GRAY から TYPE_BYTE_INDEXED にする方法 カテゴリー: program タグ: 画像信号処理, 進捗報告, Java […]