有一种方法,但你必须使用一些BufferedImage转换。创建它们之后,将其缓存或保存起来,以便稍后重新使用。从本质上讲,您想要从黑色图像(源颜色#000000)开始,仅使用Alpha层来关闭像素(也提供平滑的抗锯齿)。例如,在您的源图像中,每个像素都是黑色,但Alpha通道因像素而异。
一旦你完成了这个底漆,你需要将您的图像加载到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()方法进行一些更改即可使其工作。