Как преобразовать BufferedImage(RGB) в BufferedImage(ARGB или RGBA)?
Я пытаюсь преобразовать изображение RGB, созданное функцией Robot.createScreenCapture, в изображение ARGB. Моя цель - установить прозрачность, когда пиксель не изменился между двумя изображениями, но я получил черный цвет. Как показано на рисунке ниже.
Например, BufferedImage, созданный как показано ниже:
BufferedImage currImage = robot.createScreenCapture(new Rectangle(x, y, width,height));
Следующая функция предназначена для создания пикселя ARGB.
private BufferedImage bufferedImagesEqual(BufferedImage prevImage,
BufferedImage currImage) {
boolean changed = false;
BufferedImage imagePart = new BufferedImage(currImage.getWidth(), currImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
if (prevImage.getWidth() == currImage.getWidth()
&& prevImage.getHeight() == currImage.getHeight()) {
for (int x = 0; x < currImage.getWidth(); x++) {
for (int y = 0; y < prevImage.getHeight(); y++) {
int argb = currImage.getRGB(x, y);
if (prevImage.getRGB(x, y) != currImage.getRGB(x, y)){
// return false;
// currImage.setRGB(x, y, 0);
if(!changed){
changed = true;
}
}
else {
imagePart.setRGB(x, y, 0xff000000);
}
}
}
} else {
return imagePart;
}
if(changed){
return imagePart;
}else {
return null;
}
}
1 ответ
Решение
Начиная с изображений до и после...
Используя new Color(0, 0, 0, 0)
вместо 0xff000000
(и рисую что-то, когда пиксели равны), я получаю
С помощью...
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class ConvertBuffer {
public static void main(String[] args) {
try {
BufferedImage before = ImageIO.read(new File("/Before.jpg"));
BufferedImage after = ImageIO.read(new File("/After.jpg"));
BufferedImage result = bufferedImagesEqual(before, after);
JLabel label = new JLabel(new ImageIcon(result));
label.setOpaque(true);
label.setBackground(Color.BLUE);
JOptionPane.showMessageDialog(null, label);
} catch (Exception e) {
e.printStackTrace();
}
}
private static BufferedImage bufferedImagesEqual(BufferedImage prevImage,
BufferedImage currImage) {
boolean changed = false;
BufferedImage imagePart = new BufferedImage(currImage.getWidth(), currImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
if (prevImage.getWidth() == currImage.getWidth()
&& prevImage.getHeight() == currImage.getHeight()) {
for (int x = 0; x < currImage.getWidth(); x++) {
for (int y = 0; y < prevImage.getHeight(); y++) {
if (prevImage.getRGB(x, y) != currImage.getRGB(x, y)) {
// return false;
// currImage.setRGB(x, y, 0);
if (!changed) {
changed = true;
}
imagePart.setRGB(x, y, currImage.getRGB(x, y));
} else {
imagePart.setRGB(x, y, new Color(0, 0, 0, 0).getRGB());
}
}
}
} else {
return imagePart;
}
if (changed) {
return imagePart;
} else {
return null;
}
}
}
Так что, если у вас нет примера изображения для игры, это лучшее, что мы можем сделать...