なたで日記

いろいろな思ったこと書きますヽ(^▽^ゞ)

「BufferedImage」の TYPE_BYTE_GRAY から TYPE_BYTE_INDEXED にする方法

time 2010/02/26

「BufferedImage」の TYPE_BYTE_GRAY から TYPE_BYTE_INDEXED にする方法

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);
}

以上です。

コメント




プロフィール

なたで

なたで

明るくて楽しいことが好きです!モノづくりや旅が趣味です!

RSS フィード RSS feed GitHub GitHub Twitter Twitter YouTube YouTube



sponsored link

タイムライン