2013-03-14 4 views
0

Когда космический корабль уничтожен, я создаю список, содержащий пиксели изображения космического корабля. Пиксели - объекты моего класса Pixel. После создания списка он добавляется в основной список, где на них выполняются различные действия. Вот как выглядит мой код:Чтение пикселей из BufferedImage - неправильные значения цвета

//Code which creates an array 
List<Pixel> pixels = new LinkedList<>(); 
BufferedImage buff = (BufferedImage)image; 
for (int px = 0; px < buff.getWidth(); px++) { 
    for (int py = 0; py < buff.getHeight(); py++) { 
     int rgb = buff.getRGB(px, py); 
     int red = (rgb & 0x00ff0000) >> 16; 
     int green = (rgb & 0x0000ff00) >> 8; 
     int blue = rgb & 0x000000ff; 
     int alpha = (rgb >> 24) & 0xff; 
     if (alpha == 255) { 
      pixels.add(new Pixel(px, py, red, green, blue)); 
     } 
    } 
} 
//Pixel class constructor 
Pixel(float x, float y, int red, int green, int blue) { 
    super(x, y); 
    BufferedImage buff = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); 
    WritableRaster raster = buff.getRaster(); 
    //LOOKS EVERYTHING IS OKAY SINCE THIS LINE SO THE ERROR MUST BE SOMEWHERE IN THOSE 2 LINES 
    raster.setPixel(0, 0, new int[]{red, blue, green, 255}); 
    image = buff; 
} 

Краткое описание: изображение является частным полем типа Image. Он используется в методе repaint(), который рисует пиксель с использованием метода drawImage(). И о моей проблеме: все работает почти нормально. Пиксели создаются в правильном положении, но все они фиолетового цвета. У них разные тона (более яркие и темные), но все они фиолетовые, а не цвета того же цвета! Почему это происходит? Почему фиолетовый? Может ли кто-нибудь помочь мне понять это странное поведение?

+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

1

Это, вероятно, смесь зеленых и синих значений в вашем методе setPixel. Цвета обычно указываются в заказе RGB, который вы распаковываете из своего BufferedImage.

Вместо

raster.setPixel(0, 0, new int[]{red, blue, green, 255}); 

попробовать

raster.setPixel(0, 0, new int[]{red, green, blue, 255}); 

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

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