2013-05-01 2 views
0

디지털 카메라를 사용하여 이미지를 수집하고 있습니다. 처음에는 모노 카메라를 사용했지만 최근에는 컬러 카메라로 업그레이드했습니다. 나는 그레이 스케일 팔레트 팔레트를 변경하는 코드의이 비트를 발견 할 때까지 모노 카메라로 좀 팔레트 문제가되었다 pbmi는 BITMAPINFO *입니다이 회색조 팔레트를 색상 팔레트로 수정하려면 어떻게합니까?

for(int i=0; i<256; i++) 
{ 
    pbmi->bmiColors[i].rgbRed = BYTE(i); 
    pbmi->bmiColors[i].rgbGreen = BYTE(i); 
    pbmi->bmiColors[i].rgbBlue = BYTE(i); 
    pbmi->bmiColors[i].rgbReserved = BYTE(0); 
} 

합니다.

이렇게하면 모노 카메라에서 잘 작동합니다. 하지만 이제는 컬러 카메라로 이미지를 그레이 스케일로 만들고 싶지 않습니다. 그러나 그 코드 조각을 제거하면 모노 카메라로 이전과 같은 팔레트 문제가 발생합니다. 그래서 제가 전에했던 것처럼 비슷한 것을 할 필요가 있고 팔레트를 만들 필요가있는 것 같습니다. 이번에는 컬러 팔레트뿐입니다.

for(int i=0,a = 0; i < 64; i++) 
{ 
    pbmi->bmiColors[i].rgbRed = BYTE(a); 
    pbmi->bmiColors[i+64].rgbGreen = BYTE(a); 
    pbmi->bmiColors[i+64+64].rgbBlue = BYTE(a); 
    pbmi->bmiColors[i+64+64+64].rgbReserved = BYTE(0); 
    a += 4; 
} 
//This created a palette consisting only of cyan, yellow, and magenta colors. 
//Didn't work. 

for(int i=0,r=0,g=0,b=0; b <= 255; i++) 
{ 
    if(r >= 256) 
    { 
     r = 0; 
     g++; 
    } 
    if(g >= 256) 
    { 
     g = 0; 
     b++; 
    } 
    pbmi->bmiColors[i].rgbRed = BYTE(r); 
    pbmi->bmiColors[i].rgbGreen = BYTE(g); 
    pbmi->bmiColors[i].rgbBlue = BYTE(b); 
    pbmi->bmiColors[i].rgbReserved = BYTE(0); 

    r++; 
} 
//Here I was trying to basically count up hexadecimally from 000000 to FFFFFF. 
//Caused an access violation error. 

또한 pbmi을 변경 한 후 그 각각을 시도했다 :

//// INFO //// 
BITMAPINFO* pbmi = (BITMAPINFO*)alloca(sizeof(BITMAPINFOHEADER) + 
    sizeof(RGBQUAD)*256); 
pbmi->bmiHeader.biSize = sizeof (pbmi->bmiHeader); 
pbmi->bmiHeader.biWidth = 2752; 
pbmi->bmiHeader.biHeight = -2200; 
pbmi->bmiHeader.biPlanes = 1; 
pbmi->bmiHeader.biBitCount = 8; 
pbmi->bmiHeader.biCompression = BI_RGB; 
pbmi->bmiHeader.biSizeImage = 0; 
pbmi->bmiHeader.biXPelsPerMeter = 14173; 
pbmi->bmiHeader.biYPelsPerMeter = 14173; 
pbmi->bmiHeader.biClrUsed = 0; 
pbmi->bmiHeader.biClrImportant = 0; 

지금까지, 나는 다음과 같은 시도 : 참고로

, 여기에 pbmi의 나머지 설정입니다 -> bmiHeader.biBitCount를 16, 24 W 32로 변경하십시오.

내 질문은 :내가 제공 한 BITMAPINFO 설정을 기반으로 색상 표를 만드는 방법은 무엇입니까? 간단한 RGB 파레트를 만들려고하는 경우

+1

당신은 카메라 설명서를 확인해야합니다. 각 프레임마다 몇 바이트가 생성됩니까? –

+0

각 이미지는 2752x2200이며 6054400 픽셀입니다. 그래서 (정확한지 모르겠다면) 각 이미지는 6054400 * 3 바이트 크기라고 가정합니다. – xcdemon05

+0

가정하지 마십시오. 나는 비디오 형식을 해독하려고 시도하고있다. –

답변

0

, 당신은 0에서 255으로 R, G 전자의 B 값을 변경해야합니다

const int MaxIndex = 255; 

for(int r=0; r <= MaxIndex; r++) 
    for(int g=0; g <= MaxIndex; g++) 
     for(int b=0; b <= MaxIndex; b++) 
     { 
      i = r * MaxIndex * MaxIndex + g * MaxIndex + b 
      pbmi->bmiColors[i].rgbRed = BYTE(r); 
      pbmi->bmiColors[i].rgbGreen = BYTE(g); 
      pbmi->bmiColors[i].rgbBlue = BYTE(b); 
      pbmi->bmiColors[i].rgbReserved = BYTE(0); 
     } 
+0

당신의 예에서 '나는'어디에서 오는거야? 어디에서 어떻게 증분됩니까? – xcdemon05

+0

죄송합니다, 나는 te i에 대해 잊어 버렸습니다. 지금 고쳐졌습니다. –

+0

그러면 완전히 중복되는 16MB 색상 표가 생성됩니다. '팔레트'의 색상 값은 단순히 0 (검정색)에서 16777215 (흰색)까지의 표 색인이됩니다. 트루 컬러 이미지의 경우 팔레트가 필요하지 않습니다. –