Java 更改图像中每个像素的颜色

Java 更改图像中每个像素的颜色,java,Java,我想把不同的像素换成不同的颜色。基本上,将部分像素更改为透明 for(int i = 0; i < image.getWidth();i++) for(int j = 0; j < image.getHeight(); j ++) { image.setRGB(i,j , 0); } for(int i=0;i

我想把不同的像素换成不同的颜色。基本上,将部分像素更改为透明

for(int i = 0; i < image.getWidth();i++)
        for(int j = 0; j < image.getHeight(); j ++)
        {
            image.setRGB(i,j , 0);
        }
for(int i=0;i
//我还将第三个参数0更改为另一个属性。但它仍然不起作用。都是黑色的。你有什么想法吗

尹。 谢谢

class ImagePanel扩展了JPanel{
私有缓冲图像;
公共图像面板(整数宽度、整数高度、缓冲区图像){
这个图像=图像;
图像=新的缓冲区图像(宽度、高度、,
BuffereImage.TYPE_INT_ARGB);
重新油漆();
}
/**
*绘制图像。
*/
公共组件(图形g){
超级组件(g);
对于(int i=0;i
好的,第三个参数是RGB中的颜色,因此如果将其设置为0,它将是黑色的。

下面是一个示例代码:

private int colorToRGB(int alpha, int red, int green, int blue) {
        int newPixel = 0;
        newPixel += alpha;
        newPixel = newPixel << 8;
        newPixel += red;
        newPixel = newPixel << 8;
        newPixel += green;
        newPixel = newPixel << 8;
        newPixel += blue;

        return newPixel;
    }

第三个参数是32位的ARGB值。这以位的形式列出,如下所示:

AAAAAAAA|RRRRRRRR|GGGGGGGG|BBBBBBBBB
请参阅javadoc(假设您使用BuffereImage,您的问题实际上并没有说…)

将此BuffereImage中的像素设置为指定的RGB值。这个 假设像素处于默认RGB颜色模型中,类型为_INT_ARGB, 和默认的sRGB颜色空间。对于具有IndexColorModel的图像 选择最接近颜色的索引

  • 如果您使用的图像类型支持透明度,则设置alpha 255表示完全不透明,0表示完全透明非常重要
您可以使用位移位创建这样的值

int alpha = 255; 
int red   = 0;
int green = 255;
int blue  = 0;

int argb = alpha << 24 + red << 16 + green << 8 + blue

image.setRGB(i, j, argb);
下面是一个完整的工作示例,也许您可以与您的代码进行比较:

public class StackOverflow27071351 {
    private static class ImagePanel extends JPanel {
        private BufferedImage image;
        public ImagePanel(int width, int height, BufferedImage image) {
            this.image = image;
            image = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_ARGB);
            repaint();
        }
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            for (int i = 0; i < image.getWidth(); i++) {
                for (int j = 0; j < image.getHeight(); j++) {
                    image.setRGB(i, j, new Color(255, 0, 0, 127).getRGB());
                }
            }
            g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        int width = 640;
        int height = 480;
        frame.setSize(width, height);
        BufferedImage image = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_ARGB);
        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(new ImagePanel(width, height, image));
        frame.setVisible(true);
    }
}
公共类堆栈溢出27071351{
私有静态类ImagePanel扩展了JPanel{
私有缓冲图像;
公共图像面板(整数宽度、整数高度、缓冲区图像){
这个图像=图像;
图像=新的缓冲区图像(宽度、高度、,
BuffereImage.TYPE_INT_ARGB);
重新油漆();
}
公共组件(图形g){
超级组件(g);
对于(int i=0;i
我使用以下表格:

int[] pixel = new int[4];

// the following four ints must range 0..255
pixel[0] = redValue;
pixel[1] = greenValue;
pixel[2] = bluleValue;
pixel[3] = alphaValue;

raster.setPixel(x, y, pixel);
要获取BuffereImage的光栅,请执行以下操作:

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
WritableRaster raster = image.getRaster(); 
我做了一些性能测试,没有发现将所有颜色值字节塞进一个数字中会产生很大的差异

了解可以使用alpha值绘制不透明图像(例如RGB而不是ARGB)的技术也很好

g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) (yourAlpha)));
g2d.drawImage(...);

您可以提供第三个参数设置为什么的示例吗?什么类是
image
?该图像是一个缓冲图像,我将其输出到一个帧中。我想更改图像的部分透明度谢谢您的回答。我使用BuffereImage,并以您的方式尝试。但它也不起作用。我使用黑色图像(全黑色背景的图像)。你能发布你的代码来创建BuffereImage并显示吗it@HuazheYin我已经添加了一个完整的工作示例,显示红色,我没有看到您描述的全黑色问题…感谢您的回答。什么是alpha,我应该传递给它什么值?alpha值在0(透明)->255之间,不要忘记@Adam提到要将BuffereImage设置为键入_INT_ARGBi,但刚刚尝试过,它仍然不起作用。我的程序很简单,我只是把一个缓冲图像放到一个帧中,我可以改变帧的透明度,但我想改变部分透明度。你有更高的分辨率吗?如果你只是想改变帧的透明度,我建议你使用AlphaComposite。检查这个:我知道如何更改帧的透明度,并且我实现了它。它可以改变帧的整体透明度,但我的要求是改变部分透明度,这就是为什么我使用缓冲图像。所以我通过改变缓冲图像的部分透明度来改变帧的部分透明度。
int[] pixel = new int[4];

// the following four ints must range 0..255
pixel[0] = redValue;
pixel[1] = greenValue;
pixel[2] = bluleValue;
pixel[3] = alphaValue;

raster.setPixel(x, y, pixel);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
WritableRaster raster = image.getRaster(); 
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) (yourAlpha)));
g2d.drawImage(...);