Как отобразить серое изображение в Java после использования setRGB? - PullRequest
0 голосов
/ 14 января 2012

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

Вывод значения пикселя получается корректным как для исходного, так и для нового пикселя, но я не могу просмотреть новое изображение, оно показываетстарое, т. е. исходное изображение отображается не измененным.

1 Ответ

1 голос
/ 14 января 2012
rgbArray[0]=0x808080;  //Changing pixel values to grey

там вы меняете только первый пиксель на серый.что вы, вероятно, намеревались сделать:

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

, который изменит каждый пиксель на серый.

// edit:

Конечно, тогда каждый пиксель точно такой же(серый), что можно сделать с помощью кода, который намного меньше, например:

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