• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:ColorConvertOpで画像をグレイスケールに変換
#navi(../)
*ColorConvertOpで画像をグレイスケールに変換 [#t5e7fcf3]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2005-11-21~
更新日:&lastmod;

#contents

**概要 [#p5efc4cd]
ColorConvertOpを使って画像をグレイスケールに変換します。

#screenshot

**サンプルコード [#a2a42159]
 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;

**解説 [#s9c1238a]
用意したアイコンから、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));

**参考リンク [#wb3b736d]
-[[Image Color Gray Effect : Java examples (example source code) » 2D Graphics GUI » Image>http://www.java2s.com/Code/Java/2D-Graphics-GUI/ImageColorGrayEffect.htm]]
-[[o p u s - i アイコンフリー素材>http://opus-i.biz/]]

**コメント [#i2aa6deb]
#comment