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 に答える