Swing/ColorConvertOp のバックアップの現在との差分(No.26)
- category: swing folder: ColorConvertOp title: ColorConvertOpで画像をグレースケールに変換 tags: [ColorConvertOp, BufferedImage, RGBImageFilter, ImageIcon] author: aterai pubdate: 2005-11-21 pubdate: 2005-11-21T14:18:04+09:00 description: ColorConvertOpを使って画像をグレースケールに変換します。 image:
概要
ColorConvertOp
を使って画像をグレースケールに変換します。
Screenshot
Advertisement
サンプルコード
Image img = icon1.getImage();
BufferedImage source = new BufferedImage(
img.getWidth(this), img.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_INT_ARGB);
Graphics g = source.createGraphics();
g.drawImage(img, 0, 0, this);
g.dispose();
#spanadd
#spanend
ColorConvertOp colorConvert = new ColorConvertOp(
ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
BufferedImage destination = colorConvert.filter(source, null);
icon2 = new ImageIcon(destination);
View in GitHub: Java, Kotlin解説
用意したアイコンから、BufferedImage
を作成し、これをColorConvertOp#filter
メソッドを使ってグレースケールに変換しています。
用意したアイコンからBufferedImage
を作成し、これをColorConvertOp#filter
メソッドを使ってグレースケールに変換しています。
上記のサンプルでは、各JLabel
をクリックするとIcon
として表示されている元画像とグレースケール画像とが切り替わるようになっています。
上記のサンプルでは各JLabel
をクリックでIcon
として表示されている元画像とグレースケール画像を切り替えています。
以下のように
GrayFilter.createDisabledImage
を使った場合よりきれいに変換できるようです。
- 以下のように
GrayFilter.createDisabledImage(...)
を使った場合よりきれいに変換可能icon2 = new ImageIcon(GrayFilter.createDisabledImage(img));
- -
GrayFilter
の代わりに、以下のようなRGBImageFilter
を継承したフィルタを使う方法もあります。
-
GrayFilter
の代わりに以下のようなRGBImageFilter
を継承したフィルタを使う方法もある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 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 & 0xff000000) | (m<<16) | (m<<8) | (m); return (argb & 0xFF_00_00_00) | (m << 16) | (m << 8) | m; } } #spandel //... #spanend #spanadd // ... #spanend ImageProducer ip = new FilteredImageSource(img.getSource(), new MyGrayFilter()); icon2 = new ImageIcon(Toolkit.getDefaultToolkit().createImage(ip));
- -
BufferedImage.TYPE_BYTE_GRAY
で、BufferedImage
を作成して複写してもグレースケールに変換できますが、透過色を使用している場合はすこし注意が必要なようです(参考: Swing - Color to Grayscale to Binary)。
-
BufferedImage.TYPE_BYTE_GRAY
でBufferedImage
を作成して複写してもグレースケールに変換可能だが、透過色を使用している場合は注意が必要
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();
参考リンク
- Image Color Gray Effect : Java examples (example source code) » 2D Graphics GUI » Image
- opus-i | シンプル素材 テンプレート 音楽素材
- osakana.factory - グレースケールのひみつ
- via: プログラマメモ2: グレースケール
- Swing - image manipulation