2015-02-04 9 views
1

8 비트에서 6 비트로 RGB 색상을 양자화하고 싶습니다. 나는 다음과 같은 자바 코드를 작성 :8 비트에서 6 비트로 RGB 색상 양자화

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); 

에 :

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

내가, 내가 '돈 채널 당 픽셀 당 6 개 비트를 의미한다고 생각 원인 내 이해가 옳고 그른지, 출력 이미지가 정말로 이상하다는 것을 알지 못한다. 나는 누군가가 나를 여기 놀이에 두 가지 문제가 있습니다

답변

0

그것을 파악하는 데 도움 수 있기를 바랍니다 : 당신이 올바르게 R, G, B 구성 요소를 방문하고,

  • 당신은 결합 여부 여부

    1. 구성 요소를 올바르게

    귀하의 방문 코드는 이상하게 들리므로 보증 할 수는 없지만 쉽게 수정할 수 있어야합니다. 코드가 이미지 그레이 스케일을 만들기 위해 작동합니까? 그렇지 않다면, 고쳐서 시작하십시오.

    이제 8 비트 채널을 6 비트 채널로 변환하는 코드가 올바르게 표시되지 않습니다. 당신은 바이트 값을 0xff로 ANDing하고 있습니다. 이것은 무의미합니다. 그리고 이들 값을 OR 연산하기 전에이 값을 6 비트로 줄이지 못합니다. 6 비트로 축소하는 것은 2만큼 오른쪽으로 이동하여 수행됩니다. 따라서 다음과 같이 입력해야합니다.

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