user1595858
user1595858

Reputation: 3878

How to convert BufferedImage(RGB) to BufferedImage(ARGB or RGBA)?

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

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347184

Starting with the before and after images...

Before After

By using new Color(0, 0, 0, 0) instead of 0xff000000 (and painting SOMETHING when the pixels as equal), I get

Output

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

Related Questions