2015-11-10 2 views
0

У меня есть пользовательский класс RGB:Двумерный массив RGB для BufferedImage

class RGB { 
    int R, G, B; 
} 

я сделать двумерный массив объектов RGB, представляющие изображение:

RGB[][] image = new RGB[HEIGHT][WIDTH]; 

for (int i = 0; i < HEIGHT; i++) { 
    for (int j = 0; j < WIDTH; j++) { 
     int pixel = bufferedImage.getRGB(i, j); 
     int red = (pixel >> 16) & 0xff; 
     int green = (pixel >> 8) & 0xff; 
     int blue = (pixel) & 0xff; 
     image[i][j] = new RGB(red, green, blue); 
    } 
} 

Теперь я хочу сделать некоторые изменения в этом массиве и сохранить его как BufferedImage. Основном, я могу сделать что-то вроде этого:

BufferedImage newImage = new BufferedImage(HEIGHT, WIDTH, BufferedImage.TYPE_INT_RGB); 
for (int i = 0; i < HEIGHT; i++) { 
    for (int j = 0; j < WIDTH; j++) { 
     newImage.setRGB(i, j, VALUE); 
    } 
} 

Но мне нужно, чтобы преобразовать RGB полей каждого пикселя в одно целое значение, которое я не знаю, как это сделать. Или, может быть, есть более простой способ сделать это?

+0

Почему не просто '((red & 0xff) << 16) | ((зеленый & 0xff) << 8) | (blue & 0xff) ' –

+2

Вы использовали объект [DirectColorModel] (http://docs.oracle.com/javase/7/docs/api/java/awt/image/DirectColorModel.html) вместо того, чтобы использовать пользовательский класс RGB? Похоже, что это будет делать именно то, что вы сейчас делаете, плюс предоставить метод для получения значения int, которое вы ищете. – BlakeP

+0

Это сделало эту работу, спасибо. –

ответ

1

Будьте осторожны, функция getRGB является bufferedImage.getRGB (x, y), и вы делаете противоположное (x и y инвертированное).

Теперь вы можете работать, используя Растр или DataBuffer:.

  1. newimage.getRaster() setSample (х, у, 0, VALUE)
  2. ИНТ [] newimagebuffer = ((DataBufferInt) newimage.getRaster(). getDataBuffer) .getData(), а затем newimagebuffer [x + y * WIDTH] = VALUE.

Если вы не знаете тип изображения и не хотите дублировать код, я рекомендую Raster, но, кроме того, он определенно быстрее получает доступ и модифицирует значения изображений с помощью DataBuffer, потому что у вас есть прямой доступ к массиву. И TYPE_INT_RGB - это не самый практичный формат изображения, потому что вы должны разжимать/сжимать триплет RGB в int каждый раз. Вы можете использовать TYPE_3BYTE_BGR.