2012-01-14 3 views
-1

M, работающий над некоторой программой обработки изображений, и столкнулся с проблемой отображения изображения в оттенках серого. Я сделал это, я извлек значения пикселей, используя getRGB, а затем попытался изменить эти значения пикселей. Но после изменения значения этого пикселя я все еще получаю тот же образ, который был ранее буферизирован. Моя часть кода приведен ниже: -Как отобразить greycale изображение в java после использования setRGB?

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

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

+0

Для лучшей помощи в ближайшее время отправьте сообщение [SSCCE] (http://sscce.org/). –

+0

Вы выделяете большой «BufferedImage» в строке 2, но затем отбрасываете его и заменяете его вызовом 'ImageIO.read()'. Ради памяти, вероятно, не хочу этого делать. –

+0

yup thax ... но как я могу отобразить этот измененный пиксель как изображение? – Arizvi

ответ

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); 
+0

yess извините, что это был rgbArray [i] = 0x808080; в исходном коде я скопировал это неправильно. Я получаю правильные пиксельные значения, но я не получаю правильное изображение, отображаемое ... – Arizvi

+0

@Arizvi это странно. Если я заменил 0 на i, загрузите изображение, запустите на нем свой код и затем сохраните его, он будет изменен (каждый пиксель установлен на серый). И это то, чего можно было бы ожидать (все пиксели, где назначено новое значение, поэтому результат должен отличаться от оригинала ...) – tim

+0

Да, это правда, что каждый пиксель изменен на серый, но почему он не отображается на изображении? ? Я все еще получаю старое цветное изображение, но не новое серое изображение на панели ... – Arizvi