【问题标题】:Change the color of each pixel in an image java更改图像java中每个像素的颜色
【发布时间】:2014-11-27 06:27:03
【问题描述】:

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

for(int i = 0; i < image.getWidth();i++)
        for(int j = 0; j < image.getHeight(); j ++)
        {
            image.setRGB(i,j , 0);
        }

//我也把第三个参数0改成另一个属性。但它仍然不起作用。这一切都显示为黑色。你有什么想法吗?

阴。 谢谢

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();
    }

    /**
     * Draws the image.
     */

    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, 0);
            }
        }
        g.drawImage(image, 0, 0, getWidth(), getHeight(), this);

    }

}

【问题讨论】:

  • 你能提供你设置第三个参数的例子吗?
  • image是什么类?
  • 图像是一个缓冲图像,我把它放到一个框架中。我想改变图像的部分透明度

标签: java


【解决方案1】:

第三个参数是 32 位的 ARGB 值。这以位形式排列为:

AAAAAAAA|RRRRRRRR|GGGGGGGG|BBBBBBBBB

请参阅BufferedImage.setRGB 的 javadoc(假设您使用的是 BufferedImage,您的问题实际上并没有说...)

将此 BufferedImage 中的像素设置为指定的 RGB 值。这 像素假定为默认 RGB 颜色模型 TYPE_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);

幸运的是,java.awt.Color 实例上有一个 getRGB() 方法,因此您可以使用

image.setRGB(i, j, Color.green.getRGB());

这是一个完整的工作示例,也许您可​​以与您的代码进行比较:

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);
    }
}

【讨论】:

  • 感谢您的回答。我使用 BufferedImage,并以您的方式尝试。但它也不起作用。我使用黑色图像(全黑背景的图像)。
  • 你能发布你的代码来创建缓冲图像并显示它
  • @HuazheYin 我已经添加了一个显示红色的完整工作示例,我还没有看到你描述的全黑问题......
【解决方案2】:

嗯,第三个参数是RGB中的颜色,所以设置为0就是黑色。

【讨论】:

    【解决方案3】:

    这是一个示例代码:

    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;
        }
    

    然后

    image.setRGB(i, j, colorToRGB(alpha, 0, 0, 0))
    

    【讨论】:

    • 感谢您的回答。什么是 alpha,我应该将什么值传递给它?
    • alpha 值介于 0(透明)-> 255 之间,不要忘记 @Adam 提到的将 BufferedImage 设置为 TYPE_INT_ARGB
    • 我刚试过,还是不行。我的程序很简单,我只是将缓冲图像放入一个框架中,我可以更改框架透明度,但我想更改部分透明度。你有更多的分辨率吗?
    • 如果你只是想改变框架的透明度,我推荐使用 AlphaComposite。检查这个:java2s.com/Code/Java/2D-Graphics-GUI/MakeimageTransparency.htm
    • 我知道如何改变框架的透明度,我实现了它。它可以改变框架的整体透明度,但我的要求是改变部分透明度,这就是我使用缓冲图像的原因。所以我通过改变缓冲图像的部分透明度来改变框架的部分透明度。
    【解决方案4】:

    我使用以下形式:

    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 的光栅,我这样做:

    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(...);
    

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多