Swing/ColorConvertOp のバックアップの現在との差分(No.5)
TITLE:ColorConvertOpで画像をグレイスケールに変換
ColorConvertOpで画像をグレイスケールに変換
編集者:Terai Atsuhiro~
作成日:2005-11-21
更新日:2022-12-09 (金) 12:45:40
概要
ColorConvertOp
を使って画像をグレースケールに変換します。
Screenshot
Advertisement
概要
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
#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
#spanadd
View in GitHub: Java, Kotlinサンプルコード
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
メソッドを使ってグレースケールに変換しています。
- &jnlp;
- &jar;
- &zip;
上記のサンプルでは各
JLabel
をクリックでIcon
として表示されている元画像とグレースケール画像を切り替えています。
解説
用意したアイコンから、BufferedImageを作成し、これをColorConvertOp#filterメソッドを使ってグレイスケールに変換しています。- -
- 以下のように
GrayFilter.createDisabledImage(...)
を使った場合よりきれいに変換可能#spanend #spanadd icon2 = new ImageIcon(GrayFilter.createDisabledImage(img)); #spanend #spanadd
-
GrayFilter
の代わりに以下のようなRGBImageFilter
を継承したフィルタを使う方法もある#spanend #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 #spanadd
icon2 = new ImageIcon(GrayFilter.createDisabledImage(img));
-
BufferedImage.TYPE_BYTE_GRAY
でBufferedImage
を作成して複写してもグレースケールに変換可能だが、透過色を使用している場合は注意が必要
#spanend
#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
#spanadd
GrayFilterの代わりに、以下のようなRGBImageFilterを継承したフィルタを使う方法もあります。
参考リンク
- Image Color Gray Effect : Java examples (example source code) » 2D Graphics GUI » Image
- opus-i | シンプル素材 テンプレート 音楽素材
- osakana.factory - グレースケールのひみつ
- via: プログラマメモ2: グレースケール
- Swing - image manipulation
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(); } }
コメント
- リンクを参考にして
RGBImageFilter
を使うサンプルを修正しました。 -- aterai - グレイスケールからグレースケールに変更。 -- aterai
FilteredImageSource fis = new FilteredImageSource(img.getSource(), new MyGrayFilter()); icon2 = new ImageIcon(createImage(fis));
参考リンク
- Image Color Gray Effect : Java examples (example source code) » 2D Graphics GUI » Image
- o p u s - i アイコンフリー素材