2013-11-12 3 views
1

Я следую учебному пособию по расширению моих знаний, но наставник иногда думает, что некоторые вещи не нужно объяснять.BufferedImage автоматически обновляется, когда обновляется int-array, представляющий его растровый

посмотрите на этот код:

private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); 

someMethod() { 
    for (int i=0; i<pixels.length; i++) { 
    pixels[i] = i; 
    } 
    g.drawImage(image, 0, 0, getWidth(), getHeight(), null); 
} 

Я рисую на холсте и к моему большому удивлению, это краска цвета от черного до синего. Интересно, как получить доступ/изменить цвета красного и зеленого (так как «пиксели» представляют собой массив одиночных целых чисел). если я заменил RGB на BGR, вместо этого этот цвет будет красным. Но это побочный эффект. EDIT: красить зеленые и красные операторы с битрейтом << and |. например: int greenColor = 255<<16; или int greenAndRed = 255<<16 | 255<<8;EDIT-END

Одна из основных головоломки здесь почему-либо окрашивается вообще. Как назначить значения пикселю обновления массива пикселей? (Я вообще не понимаю объявление поля. Что такое массив, который есть). Но мои знания Java говорят мне, что это не имеет значения. Это обычный int-массив с обычными ints. Может ли кто-нибудь сказать мне, что происходит?

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

+0

System.out.println возвращает true, если вы меняете пиксель [1] на пиксели [1] – arynaq

+0

@arynaq О, да, извините. Это была опечатка. Вопрос был основан на ошибке с моей стороны. Я мог бы поклясться, что массивы неизменны. Я просто удалю эту часть ОП. – user2651804

ответ

3

Растр - это опорная датамодель изображения. int[] pixels, который вы получаете здесь, является ссылкой на данные резервной копии. Изменение значения в массиве пикселей фактически изменяет значение данных резервного копирования, сразу же видимых на изображении.

+0

Ну, это может быть не сразу видно, как только вы измените массив, но как только вы нарисуете изображение, да. –

+0

Я боялся, что ответ будет таким. Потому что единственное, что я могу повторить, это: «Почему?». Это противоречит моему пониманию переменных в Java. Как это соединение между массивом и изображением? – user2651804

+0

Я работал с моделями данных, когда возился с Swing.Jtable, и это меня удивило, что всякий раз, когда я менял значение в своем приложении, модель автоматически вызывала бы свой метод valueAt для обновления таблицы. скажите этому изображению, что он должен быть окрашен «пикселями». – user2651804

Смежные вопросы