TITLE:ColorConvertOpで画像をグレイスケールに変換

ColorConvertOpで画像をグレイスケールに変換

編集者:Terai Atsuhiro
作成日:2005-11-21
更新日:2022-12-09 (金) 12:45:40

概要

ColorConvertOpを使って画像をグレイスケールに変換します。

#screenshot

サンプルコード

 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);
  • &jnlp;
  • &jar;
  • &zip;

解説

用意したアイコンから、BufferedImageを作成し、これをColorConvertOp#filterメソッドを使ってグレイスケールに変換しています。

上記のサンプルでは、ラベルをクリックすると元画像とグレイスケール画像とが切り替わるようになっています。

以下のようにGrayFilter.createDisabledImageを使った場合よりきれいに変換できるようです。

 icon2 = new ImageIcon(GrayFilter.createDisabledImage(img));

GrayFilterの代わりに、以下のようなRGBImageFilterを継承したフィルタを使う方法もあります。

 class MyGrayFilter extends RGBImageFilter {
   public MyGrayFilter() {
     canFilterIndexColorModel = true;
   }
   public int filterRGB(int x, int y, int rgb) {
     int a = (rgb >> 24) & 0xff;
     int r = (rgb >> 16) & 0xff;
     int g = (rgb >> 8) & 0xff;
     int b = rgb & 0xff;
     int m = Math.max(Math.max(r,g),b);
     return new Color(m,m,m,a).getRGB();
   }
 }
 
 FilteredImageSource fis = new FilteredImageSource(img.getSource(), new MyGrayFilter());
 icon2 = new ImageIcon(createImage(fis));

BufferedImage.TYPE_BYTE_GRAY で、BufferedImageを作成して複写してもグレイスケールに変換できますが、透過色を使用している場合はすこし注意が必要なようです(参考:Color to Grayscale to Binary)。

 BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
 bi.createGraphics().drawImage(img, 0, 0, this);

参考リンク

コメント