How to turn ImageIcon to gray on Swing
Asked Answered
T

2

11

I would like to know if there is some way in Swing to turn an ImageIcon to gray scale in a way like:

component.setIcon(greyed(imageIcon));
Thyestes answered 16/1, 2013 at 12:28 Comment(0)
Q
14

One limitation of GrayFilter.createDisabledImage() is that it is designed to create a disabled appearance for icons across diverse Look & Feel implementations. Using this ColorConvertOp example, the following images contrast the effect:

GrayFilter.createDisabledImage(): com.apple.laf.AquaLookAndFeel image

ColorConvertOp#filter(): com.apple.laf.AquaLookAndFeel image

GrayFilter.createDisabledImage(): com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel image

ColorConvertOp#filter(): com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel image

/**
 * @see https://mcmap.net/q/969127/-how-to-turn-imageicon-to-gray-on-swing/230513
 * @see https://mcmap.net/q/1014434/-program-not-accessing-method-paintcomponent-of-extended-jpanel-class
 */
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);
}
Quoin answered 16/1, 2013 at 13:59 Comment(3)
I currently just needed it for disabled icons, but your answer is way better mine, so I'll choose that one. Thank you for the great answer.Thyestes
You are welcome, and thank you. I won't say better, just complementary. :-)Quoin
Small enhancement to the code above: use gc.createCompatibleImage(w, h, Transparency.TRANSLUCENT); instead of gc.createCompatibleImage(w, h); to keep the original icons translucency.Molybdous
T
11

You can use the following:

ImageIcon icon = new ImageIcon("yourFile.gif");
Image normalImage = icon.getImage();
Image grayImage = GrayFilter.createDisabledImage(normalImage);
Thyestes answered 16/1, 2013 at 12:28 Comment(1)
@DavidKroukamp Asking and answering your question is encouraged on the Stack Exchange network, see - meta.stackexchange.com/a/17847/140951 (and I have other references if you want them) for more.Drone

© 2022 - 2024 — McMap. All rights reserved.