在 java 中将色调应用于图像
我正在尝试为我的程序创建几种类似的视觉样式,每种样式都有不同的颜色主题。为此,我实现了使用图标来表示 s 和 s 的不同状态。与其为每种可能的颜色制作一套完整的图标,有没有办法在显示图像之前只取一组图标并更改图像的色调/饱和度/亮度/alpha?JCheckBox
JRadioButton
我正在尝试为我的程序创建几种类似的视觉样式,每种样式都有不同的颜色主题。为此,我实现了使用图标来表示 s 和 s 的不同状态。与其为每种可能的颜色制作一套完整的图标,有没有办法在显示图像之前只取一组图标并更改图像的色调/饱和度/亮度/alpha?JCheckBox
JRadioButton
有一种方法,但你必须利用一些BufferedImage转换。创建后,请缓存它们或保存它们以便以后轻松重用。从本质上讲,您希望从仅使用 Alpha 图层关闭像素(同时提供平滑抗锯齿)的黑色图像(源颜色 #000000)开始。例如,在源图像中,每个像素都是黑色的,但 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颜色。如果源图像是黑色的,则无论您提供什么颜色,都将按照您指定的方式编写。对于使用“0”表示 Alpha 通道的新颜色,将遵循原始 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;
}
当然,如果您注意,我们必须做完全相同的事情来将图像读取到缓冲图像中,就像我们对其进行着色一样。简而言之,如果您更改了方法的签名以接受对象,则只需对getWidth()和getHeight()方法进行一些更改即可使其正常工作。colorImage
Image
要计算每个颜色分量的平均值并保留原始 Alpha,请执行以下操作:
public static void tint(BufferedImage image, Color color) {
for (int x = 0; x < image.getWidth(); x++) {
for (int y = 0; y < image.getHeight(); y++) {
Color pixelColor = new Color(image.getRGB(x, y), true);
int r = (pixelColor.getRed() + color.getRed()) / 2;
int g = (pixelColor.getGreen() + color.getGreen()) / 2;
int b = (pixelColor.getBlue() + color.getBlue()) / 2;
int a = pixelColor.getAlpha();
int rgba = (a << 24) | (r << 16) | (g << 8) | b;
image.setRGB(x, y, rgba);
}
}
}
这最适合我的情况。