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 设置创建调色板?

4

1 回答 1

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);
        }
于 2013-05-01T19:30:50.103 回答