在java中对图像应用色调 - 代码日志

在java中对图像应用色调

我正在为我的程序创建几个类似的视觉样式,每个都有不同的颜色主题。为此,我已经实现了使用图标来表示JCheckBox和JRadioButtons的不同状态。而不是为每个可能的颜色制作一整套图标,是否有任何方式可以只显示一组,并在显示之前更改图像的色相/饱和度/亮度/ alpha?
有一种方法,但你必须使用一些BufferedImage转换。创建它们之后,将其缓存或保存起来,以便稍后重新使用。从本质上讲,您想要从黑色图像(源颜色#000000)开始,仅使用Alpha层来关闭像素(也提供平滑的抗锯齿)。例如,在您的源图像中,每个像素都是黑色,但Alpha通道因像素而异。

首先,阅读这篇文章的一些背景信息:http://www.javalobby.org/articles/ultimate-image/

一旦你完成了这个底漆,你需要将您的图像加载到BufferedImage中:

BufferedImage loadImg = ImageUtil.loadImage("C:/Images/myimg.png");

接下来,您需要创建一个新的BufferedImage来进行转换:

public BufferedImage colorImage(BufferedImage loadImg, int red, int green, int blue) {
    BufferedImage img = new BufferedImage(loadImg.getWidth(), loadImg.getHeight(),
        BufferedImage.TRANSLUCENT);
    Graphics2D graphics = img.createGraphics(); 
    Color newColor = new Color(red, green, blue, 0 /* alpha needs to be zero */);
    graphics.setXORMode(newColor);
    graphics.drawImage(loadImg, null, 0, 0);
    graphics.dispose();
    return img;
}

基本上,setXORMode将XOR您提供的颜色与源图像中的颜色。如果源图像为黑色,则您提供的任何颜色将按照您指定的方式编写。对于Alpha通道,使用“0”的新颜色,将遵循原始的Alpha通道值。最终的结果是您正在寻找的复合材料。

编辑:

您可以以两种方式之一加载初始BufferedImage。最简单的方法是使用Java的较新的ImageIO API:http://download.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html将文件直接加载到BufferedImage。电话会看起来像这样:

BufferedImage img = ImageIO.read(url); 

或者,您可以创建一种使用ToolKit读取图像的方法。

public BufferedImage loadImage(String url) {
    ImageIcon icon = new ImageIcon(url);
    Image image = icon.getImage();

    // Create empty BufferedImage, sized to Image
    BufferedImage buffImage = 
      new BufferedImage(
        image.getWidth(null), 
        image.getHeight(null), 
        BufferedImage.TYPE_INT_ARGB);

    // Draw Image into BufferedImage
    Graphics g = buffImage.getGraphics();
    g.drawImage(image, 0, 0, null);
    return buffImage;
}

当然,如果你注意,我们必须做同样的事情来将图像读入一个缓冲图像,就像我们所做的那样进行着色。简而言之,如果您更改了colorImage方法的签名以接受Image对象,则只需要对getWidth()和getHeight()方法进行一些更改即可使其工作。

http://stackoverflow.com/questions/4248104/applying-a-tint-to-an-image-in-java

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在java中对图像应用色调