2015-01-10 3 views
2

По какой-то причине, я могу изменить буферное изображение с помощью setRGB, но не с помощью фактического целочисленный массив в растре:Почему я не могу изменить этот BufferedImage?

Это работает

BufferedImage img = new BufferedImage(32, 32, BufferedImage.TYPE_INT_RGB); 

for (int y = 0; y < 32; y++) { 
    for (int x = 0; x < 32; x++) { 
     int gray = (int) (MathUtil.noise(x, y) * 255); //I have tested the noise function, and know it works fine 
     img.setRGB(x, y, gray << 16 | gray << 8 | gray); 
    } 
} 

Это не

BufferedImage img = new BufferedImage(32, 32, BufferedImage.TYPE_INT_RGB); 
int[] data = ((DataBufferInt) img.getData().getDataBuffer()).getData(); 

for (int y = 0; y < 32; y++) { 
    for (int x = 0; x < 32; x++) { 
     int gray = (int) (MathUtil.noise(x, y) * 255); //I have tested the noise function, and know it works fine 
     data[x + y * 32] = gray << 16 | gray << 8 | gray; 
    } 
} 

Функция шума:

public static float noise(int x, int y) { 
    int n = x + y * 57; 
    n = (n << 13)^n; 
    return Math.abs((1.0f - ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff)/1073741824.0f)); 
} 

EDIT

Nevermind Я исправил его. Мне нужно было использовать getRaster: P

+0

Какая ошибка? – 5gon12eder

+0

@ 5gon12eder Нет ошибки, изображение должно быть некогерентным шумом, но получается черным – name

+0

Почему вы заново изобретаете колесо (через функцию 'noise')? – specializt

ответ

3

Потому что, когда вы вызываете BufferedImage.getData(), он возвращает копию, а не фактический массив поддержки. Поэтому любые изменения, внесенные вами непосредственно в этот массив, не будут отображаться на изображении.

Из JavaDoc for BufferedImage.getData():

Возвращает: растровой, который является копией данных изображения.

Редактировать Что интересно, что он говорит для той же методы в Java 6 JavaDoc, это более четко о эффектах к копии. Интересно, почему они изменили его?

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

+0

Что? Он никогда не работал так! Клянусь, я делаю это целую вечность! – name

+0

Nevermind Я исправил это, глупо мне – name

+0

Да, это похоже на вызов 'getRaster()' вместо 'getData()'. Может, и все? – Todd

0

Может ли ответ быть таким простым, как изменения в массиве данных, которые не отражаются в объекте img?

+0

Возможно, но это никогда не делалось, поэтому я смущен. У меня все еще есть java 7 – name

+0

@Todd предоставил более техническую версию того, что я только что сказал, но получение данных возвращает только копию, поэтому вам придется затем превратить этот массив данных в BufferedImage, чтобы увидеть изменения. – Rgw3d

+0

Thing is, Я всегда делал это таким образом, и это отражало бы все изменения на своем собственном – name

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