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 […]