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

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

編集者:Terai Atsuhiro~

作成日:2005-11-21
更新日:2022-12-09 (金) 12:45:40
  • category: swing folder: ColorConvertOp title: ColorConvertOpで画像をグレースケールに変換 tags: [ColorConvertOp, BufferedImage, RGBImageFilter, ImageIcon] author: aterai pubdate: 2005-11-21T14:18:04+09:00 description: ColorConvertOpを使って画像をグレースケールに変換します。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTJmEhFayI/AAAAAAAAAUo/x4JGGk_f08c/s800/ColorConvertOp.png

概要

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

概要

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

サンプルコード

#spanend
#spanadd
Image img = icon1.getImage();
#spanend
#spanadd
BufferedImage source = new BufferedImage(
#spanend
    img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_INT_ARGB);
#spanadd
Graphics g = source.createGraphics();
#spanend
#spanadd
g.drawImage(img, 0, 0, this);
#spanend
#spanadd
g.dispose();
#spanend

#spandel
#screenshot
#spanend
#spandel

#spanend
#spandel
**サンプルコード [#a2a42159]
#spanend
#spandel
#code{{
#spanend
 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);
#spanadd
ColorConvertOp colorConvert = new ColorConvertOp(
#spanend
    ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
#spanadd
BufferedImage destination = colorConvert.filter(source, null);
#spanend
#spanadd
icon2 = new ImageIcon(destination);
#spanend
View in GitHub: Java, Kotlin
  • &jnlp;
  • &jar;
  • &zip;

解説

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

解説

用意したアイコンからBufferedImageを作成し、これをColorConvertOp#filterメソッドを使ってグレースケールに変換しています。 上記のサンプルでは、ラベルをクリックすると元画像とグレイスケール画像とが切り替わるようになっています。 上記のサンプルでは各JLabelをクリックでIconとして表示されている元画像とグレースケール画像を切り替えています。 以下のようにGrayFilter.createDisabledImageを使った場合よりきれいに変換できるようです。
  • -
  • 以下のようにGrayFilter.createDisabledImage(...)を使った場合よりきれいに変換可能
     icon2 = new ImageIcon(GrayFilter.createDisabledImage(img));
    #spanadd
    icon2 = new ImageIcon(GrayFilter.createDisabledImage(img));
    #spanend
    
GrayFilterの代わりに、以下のようなRGBImageFilterを継承したフィルタを使う方法もあります。
  • 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));
    #spanadd
    class MyGrayFilter extends RGBImageFilter {
    #spanend
      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 Coefficients
        return (argb & 0xFF_00_00_00) | (m << 16) | (m << 8) | m;
      }
    #spanadd
    }
    #spanend
    #spanadd
    // ...
    #spanend
    #spanadd
    ImageProducer ip = new FilteredImageSource(img.getSource(), new MyGrayFilter());
    #spanend
    #spanadd
    icon2 = new ImageIcon(Toolkit.getDefaultToolkit().createImage(ip));
    #spanend
    
BufferedImage.TYPE_BYTE_GRAY で、BufferedImageを作成して複写してもグレイスケールに変換できますが、透過色を使用している場合はすこし注意が必要なようです(参考:Color to Grayscale to Binary)。
  • BufferedImage.TYPE_BYTE_GRAYBufferedImageを作成して複写してもグレースケールに変換可能だが、透過色を使用している場合は注意が必要
 BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
 bi.createGraphics().drawImage(img, 0, 0, this);
#spanadd
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
#spanend
#spanadd
Graphics g = bi.createGraphics();
#spanend
#spanadd
//g.setColor(Color.WHITE);
#spanend
#spanadd
g.fillRect(0, 0, w, h); // pre-fill: alpha
#spanend
#spanadd
g.drawImage(img, 0, 0, this);
#spanend
#spanadd
g.dispose();
#spanend

参考リンク

参考リンク

コメント

コメント