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

以上です。

コメント

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

タイトルとURLをコピーしました