2015-02-04 6 views
1

Я хочу квантовать цвет RGB от 8 бит до 6 бит. Я написал Java-код следующим образом:RGB Цветное квантование от 8 бит до 6 бит

int ind = 0; 
for(int y = 0; y < height; y++){  
    for(int x = 0; x < width; x++){ 
     byte a = 0; 
     byte r = bytes[ind]; 
     byte g = bytes[ind+height*width]; 
     byte b = bytes[ind+height*width*2]; 

     int pix = 0xff000000 | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff); 
     img.setRGB(x,y,pix); 
     ind++; 
    } 
} 

Затем я изменил:

int pix = 0xff000000 | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff); 

To:

int pix = 0xff000000 | ((r & 0xff) << 12) | ((g & 0xff) << 6) | (b & 0xff); 

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

ответ

0

Есть две проблемы в игре здесь:

  1. ли вы правильно посещать компоненты R, G, B, и
  2. ли вы комбинируя компонентов правильно.

Ваш код посещения довольно странный, поэтому я не могу ручаться за него, но это должно быть легко исправить: работает ли ваш код для создания изображения в оттенках серого? Если нет, то начните с фиксации этого.

Теперь ваш код для преобразования 8-битных каналов в 6-битные каналы выглядит неправильно. Вы являетесь значениями байта ANDing с 0xff, что бессмысленно, а затем вы не сжимаете эти значения до 6 бит перед их объединением. Сокращение до 6 бит выполняется сдвигом вправо на 2. Таким образом, я думаю, вам нужно что-то вроде этого:

r >>= 2; 
g >>= 2; 
b >>= 2; 
int pix = (r << 12) | (g << 6) | b;