简体   繁体   English

如何将BufferedImage(RGB)转换为BufferedImage(ARGB或RGBA)?

[英]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. 我正在尝试将Robot.createScreenCapture函数产生的RGB图像转换为ARGB图像。 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:

 BufferedImage currImage = robot.createScreenCapture(new Rectangle(x, y, width,height));

The following function is intended to create ARGB pixel. 以下功能旨在创建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;
    }
}

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 通过使用new Color(0, 0, 0, 0) 0xff000000 new Color(0, 0, 0, 0)而不是0xff000000 (并在像素相等时绘制SOMETHING),我得到

产量

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... 因此,除非您有示例图像可玩,否则这是我们能做到的最好的...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM