【问题标题】:How to display the greycale image in java after using setRGB?使用setRGB后如何在java中显示灰度图像?
【发布时间】:2012-01-15 01:10:28
【问题描述】:

M 正在处理一些图像处理程序,但遇到了显示灰度图像的问题。我所做的是,我使用 getRGB 提取像素值,然后尝试更改这些像素值。但是在更改这些像素值之后,我仍然得到之前缓冲的相同图像。我的部分代码如下:-

  int [] rgbArray=new int[width*height];
  BufferedImage buffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  buffer = ImageIO.read(new File(file));


  //Before changing the pixel values
  buffer.getRGB(0, 0, width, height, rgbArray , 0,width );
  int a = (0xff000000 & rgbArray[0]) >>> 24;
  int r = (0x00ff0000 & rgbArray[0]) >> 16;
  int g = (0x0000ff00 & rgbArray[0]) >> 8;
  int b = (0x000000ff & rgbArray[0]);
  System.out.println("a " + a + " r " + r + " g " + g + " b " + b);
  System.out.println("rgbArray["+0+"] = "+ rgbArray[0]);
  for(int i = 0 ; i<width*height; i++)
   {
     rgbArray[0]=0x808080;  //Changing pixel values to grey
   }
  buffer.setRGB(0, 0, width, height, rgbArray , 0,width);


  //After changing the pixel values
  buffer.getRGB(0, 0, width, height, rgbArray , 0,width );
  a = (0xff000000 & rgbArray[0]) >>> 24;
  r = (0x00ff0000 & rgbArray[0]) >> 16;
  g = (0x0000ff00 & rgbArray[0]) >> 8;
  b = (0x000000ff & rgbArray[0]);
  System.out.println("a " + a + " r " + r + " g " + g + " b " + b);
  System.out.println("rgbArray["+0+"] = "+ rgbArray[0]);

像素值的输出对于原始像素和新像素都是正确的,但我无法查看新图像,它显示的是旧图像,即显示的是原始图像而不是更改后的图像。

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE。
  • 您在第 2 行中分配了一个大的 BufferedImage,但随后将其丢弃并替换为对 ImageIO.read() 的调用。为了记忆,可能不想这样做。
  • 是的,谢谢...但是我怎样才能将这个更改的像素显示为图像??

标签: java bufferedimage grayscale


【解决方案1】:
rgbArray[0]=0x808080;  //Changing pixel values to grey

您只是将第一个像素更改为灰色。你可能打算做什么:

rgbArray[i]=0x808080;  //Changing pixel values to grey

这会将每个像素变为灰色。

// 编辑:

当然,那么每个像素都是完全相同的(灰色),这可以用更少的代码来完成,例如:

    Graphics2D g2 = buff.createGraphics();
    g2.setColor(Color.grey);
    g2.fillRect(0, 0, buff.getWidth(), buff.getHeight());
    g2.dispose();

如果您想要一张黑白图片而不是彩色图片,请尝试:

    BufferedImageOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
    buffer =  op.filter(buffer, null);

【讨论】:

  • 是的对不起它是 rgbArray[i]=0x808080;在原始代码中我复制错了..我得到了正确的像素值,但我没有得到正确的图像显示......
  • @Arizvi 这很奇怪。如果我用 i 替换 0,加载图像,在其上运行代码,然后保存它,它会被更改(每个像素都设置为灰色)。这就是人们所期望的(所有像素都分配了一个新值,因此结果应该与原来的不同......)
  • 是的,每个像素都变为灰色,但为什么它没有显示在图像上?我仍然得到旧的彩色图像,但面板上没有新的灰色图像......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多