次のような方法で ImageIcon をグレースケールに変換する方法が Swing にあるかどうかを知りたいです。
component.setIcon(greyed(imageIcon));
次のような方法で ImageIcon をグレースケールに変換する方法が Swing にあるかどうかを知りたいです。
component.setIcon(greyed(imageIcon));
の制限の 1 つは、さまざまなルック アンド フィールの実装でアイコンの無効GrayFilter.createDisabledImage()
な外観を作成するように設計されていることです。この例を使用すると、次の画像で効果が対比されます。ColorConvertOp
GrayFilter.createDisabledImage()
:com.apple.laf.AquaLookAndFeel
ColorConvertOp#filter()
:com.apple.laf.AquaLookAndFeel
GrayFilter.createDisabledImage()
:com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
ColorConvertOp#filter()
:com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
/**
* @see https://stackoverflow.com/q/14358499/230513
* @see https://stackoverflow.com/a/12228640/230513
*/
private Icon getGray(Icon icon) {
final int w = icon.getIconWidth();
final int h = icon.getIconHeight();
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gd.getDefaultConfiguration();
BufferedImage image = gc.createCompatibleImage(w, h);
Graphics2D g2d = image.createGraphics();
icon.paintIcon(null, g2d, 0, 0);
Image gray = GrayFilter.createDisabledImage(image);
return new ImageIcon(gray);
}
以下を使用できます。
ImageIcon icon = new ImageIcon("yourFile.gif");
Image normalImage = icon.getImage();
Image grayImage = GrayFilter.createDisabledImage(normalImage);