Posted by aterai at 2005-11-21
ColorConvertOpで画像をグレースケールに変換
ColorConvertOpを使って画像をグレースケールに変換します。
サンプルコード
Image img = icon1.getImage();
BufferedImage source = new BufferedImage(
img.getWidth(this), img.getHeight(this),
BufferedImage.TYPE_4BYTE_ABGR);
Graphics g = source.createGraphics();
g.drawImage(img, 0, 0, this);
g.dispose();
ColorConvertOp colorConvert = new ColorConvertOp(
ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
BufferedImage destination = colorConvert.filter(source, null);
icon2 = new ImageIcon(destination);
解説
用意したアイコンから、BufferedImageを作成し、これをColorConvertOp#filterメソッドを使ってグレースケールに変換しています。
上記のサンプルでは、ラベルをクリックすると元画像とグレースケール画像とが切り替わるようになっています。
以下のようにGrayFilter.createDisabledImageを使った場合よりきれいに変換できるようです。
icon2 = new ImageIcon(GrayFilter.createDisabledImage(img));
GrayFilterの代わりに、以下のようなRGBImageFilterを継承したフィルタを使う方法もあります。
class MyGrayFilter extends RGBImageFilter {
public int filterRGB(int x, int y, int argb) {
//int a = (argb >> 24) & 0xff;
int r = (argb >> 16) & 0xff;
int g = (argb >> 8) & 0xff;
int b = (argb ) & 0xff;
//http://ofo.jp/osakana/cgtips/grayscale.phtml
int m = (2*r+4*g+b)/7; //NTSC係数による加重平均法(近似)
return (argb & 0xff000000) | (m<<16) | (m<<8) | (m);
}
}
//...
ImageProducer ip = new FilteredImageSource(img.getSource(), new MyGrayFilter());
icon2 = new ImageIcon(Toolkit.getDefaultToolkit().createImage(ip));
BufferedImage.TYPE_BYTE_GRAY で、BufferedImageを作成して複写してもグレースケールに変換できますが、透過色を使用している場合はすこし注意が必要なようです(参考:OTN Discussion Forums : Color to Grayscale to Binary)。
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
Graphics g = bi.createGraphics();
//g.setColor(Color.WHITE);
g.fillRect(0, 0, w, h); // pre-fill: alpha
g.drawImage(img, 0, 0, this);
g.dispose();
参考リンク
- Image Color Gray Effect : Java examples (example source code) » 2D Graphics GUI » Image
- opus-i | シンプル素材 テンプレート 音楽素材
フィルタによる半透明な画像の作成- osakana.factory - グレースケールのひみつ
- Java Programming (Archive) - image manipulation
コメント
- リンクを参考にしてRGBImageFilterを使うサンプルを修正しました。 -- aterai 2007-08-21 (火) 13:06:10
- グレイスケールからグレースケールに変更。 -- aterai 2008-01-10 (木) 14:31:00
