如何将此灰度调色板修改为调色板?

时间:2013-05-01 19:22:56

标签: c++ image colors bitmap palette

我正在使用数码相机拍摄图像。起初,我使用的是单声道相机,但最近我升级为彩色相机。使用单声道相机我遇到了一些调色板问题,直到我发现这段代码将调色板改为灰度调色板:

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-&gt; bmiHeader.biBitCount更改为16,24和32之后,我也尝试了其中的每一个,但没有一个有效。

所以我的问题是: 如何根据我提供的BITMAPINFO设置创建调色板?

1 个答案:

答案 0 :(得分:0)

如果您尝试创建一个简单的RGB调色板,只需将R,G e 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);
        }