Reputation: 3878
I'm trying to convert the RGB image produced by the Robot.createScreenCapture function to ARGB image. My goal is to set transparency when the pixel haven't changed between two images but I get black color. As shown in the below image.
For example BufferedImage as created as below:
BufferedImage currImage = robot.createScreenCapture(new Rectangle(x, y, width,height));
The following function is intended to create ARGB pixel.
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;
}
}
Upvotes: 1
Views: 3070
Reputation: 347184
Starting with the before and after images...
By using new Color(0, 0, 0, 0)
instead of 0xff000000
(and painting SOMETHING when the pixels as equal), I get
Using...
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;
}
}
}
So, unless you have an example image to play with, this is the best we can do...
Upvotes: 1