我正在使用數碼相機獲取圖像。起初,我使用的是單色相機,但最近我升級爲彩色相機。隨着單相機我是有一些問題的調色板,直到我發現這段代碼來改變調色板灰度調色板:如何將這個灰度調色板修改爲調色板?
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設置創建調色板?
您需要檢查的文檔,你的相機。每幀有多少個字節? – 2013-05-01 19:46:57
那麼每個圖像都是2752x2200,即6054400像素。所以(糾正我,如果這是不準確的)我會假設每個圖像是6054400 * 3字節的大小。 – xcdemon05 2013-05-01 19:55:49
請不要假設。我試圖破譯視頻格式。 – 2013-05-01 19:57:47