Swing/ColorConvertOp の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/ColorConvertOp へ行く。
- Swing/ColorConvertOp の差分を削除
--- 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 --- * 概要 [#summary] `ColorConvertOp`を使って画像をグレースケールに変換します。 #download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTJmEhFayI/AAAAAAAAAUo/x4JGGk_f08c/s800/ColorConvertOp.png) * サンプルコード [#sourcecode] #code(link){{ Image img = icon1.getImage(); BufferedImage source = new BufferedImage( img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_INT_ARGB); 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); }} * 解説 [#explanation] 用意したアイコンから、`BufferedImage`を作成し、これを`ColorConvertOp#filter`メソッドを使ってグレースケールに変換しています。 用意したアイコンから`BufferedImage`を作成し、これを`ColorConvertOp#filter`メソッドを使ってグレースケールに変換しています。 上記のサンプルでは、各`JLabel`をクリックで`Icon`として表示されている元画像とグレースケール画像を切り替えています。 上記のサンプルでは各`JLabel`をクリックで`Icon`として表示されている元画像とグレースケール画像を切り替えています。 ---- - 以下のように`GrayFilter.createDisabledImage(...)`を使った場合よりきれいに変換可能 #code{{ icon2 = new ImageIcon(GrayFilter.createDisabledImage(img)); }} - `GrayFilter`の代わりに以下のような`RGBImageFilter`を継承したフィルタを使う方法もある #code{{ 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 Coefficients return (argb & 0xFF_00_00_00) | (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`を作成して複写してもグレースケールに変換可能だが、透過色を使用している場合は注意が必要 -- 参考: [https://community.oracle.com/thread/1373262 Swing - Color to Grayscale to Binary] #code{{ 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(); }} * 参考リンク [#reference] - [http://www.java2s.com/Code/Java/2D-Graphics-GUI/ImageColorGrayEffect.htm Image Color Gray Effect : Java examples (example source code) » 2D Graphics GUI » Image] - [http://opus-i.biz/ opus-i | シンプル素材 テンプレート 音楽素材] - [http://ofo.jp/osakana/cgtips/grayscale.phtml osakana.factory - グレースケールのひみつ] --via: [http://programamemo2.blogspot.com/2007/08/blog-post_21.html プログラマメモ2: グレースケール] - [https://community.oracle.com/thread/1903279 Swing - image manipulation] * コメント [#comment] #comment - リンクを参考にして`RGBImageFilter`を使うサンプルを修正しました。 -- &user(aterai); &new{2007-08-21 (火) 13:06:10}; - グレイスケールからグレースケールに変更。 -- &user(aterai); &new{2008-01-10 (木) 14:31:00}; #comment