Есть способ, но вам придется использовать некоторые преобразования BufferedImage. После того, как вы их создадите, сохраните их в кеш-памяти или сохраните для последующего использования. По сути, вы хотите начать с черного изображения (исходный цвет # 000000), в котором альфа-слой используется только для отключения пикселей (также обеспечивая плавное сглаживание). Например, в исходном изображении каждый пиксель черный, но альфа-канал отличается от пикселя к пикселю.
Во-первых, прочтите эту статью для получения дополнительной информации: 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» для альфа-канала, будут сохранены исходные значения альфа-канала. Конечный результат - это композит, который вы ищете.
Edit:
Вы можете загрузить начальный BufferedImage одним из двух способов. Самый простой - использовать более новый API ImageIO Java: 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 (), чтобы он заработал.