2013-05-01 145 views
0

我正在使用數碼相機獲取圖像。起初,我使用的是單色相機,但最近我升級爲彩色相機。隨着單相機我是有一些問題的調色板,直到我發現這段代碼來改變調色板灰度調色板:如何將這個灰度調色板修改爲調色板?

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

其中PBMI是BITMAPINFO *。

這對單聲道相機很好。但現在用彩色相機我顯然不想讓圖像灰度。但是,如果我刪除了這部分代碼,就會得到與之前使用單色相機相同的調色板問題。所以在我看來,我需要像以前一樣做類似的事情,並創建一個調色板,這次只是一個調色板。

僅供參考,這裏的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; 

到目前爲止,我已經試過如下:

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之後也嘗試過每那些 - > bmiHeader.biBitCount爲16,24和32,其中沒有一個能夠工作。

所以我的問題是:如何根據我提供的BITMAPINFO設置創建調色板?

+1

您需要檢查的文檔,你的相機。每幀有多少個字節? – 2013-05-01 19:46:57

+0

那麼每個圖像都是2752x2200,即6054400像素。所以(糾正我,如果這是不準確的)我會假設每個圖像是6054400 * 3字節的大小。 – xcdemon05 2013-05-01 19:55:49

+0

請不要假設。我試圖破譯視頻格式。 – 2013-05-01 19:57:47

回答

0

如果你想創建一個簡單的RGB調色板,你只需要在R,G式B值從0更改爲255:

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

你的例子中'i'來自哪裏?它如何以及在哪裏遞增? – xcdemon05 2013-05-01 19:35:05

+0

對不起,我忘記了我,現在修好了。 – 2013-05-01 19:52:14

+0

這將產生一個16MB的顏色表,這是完全多餘的。 「調色板」中的顏色值最終只是從0(黑色)到16777215(白色)的表格索引。對於真彩色圖像,您不需要調色板。 – 2013-05-01 19:53:01