Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将此灰度调色板修改为调色板?_C++_Image_Colors_Bitmap_Palette - Fatal编程技术网

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

C++ 如何将此灰度调色板修改为调色板?,c++,image,colors,bitmap,palette,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);

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

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);
}
到目前为止,我已经尝试了以下方法:

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.
for(int i=0,a=0;i<64;i++)
{
pbmi->bmiColors[i].rgb=字节(a);
pbmi->bmiColors[i+64].rgbGreen=字节(a);
pbmi->bmiColors[i+64+64].rgbBlue=字节(a);
pbmi->bmiColors[i+64+64+64].rgbReserved=BYTE(0);
a+=4;
}
//这创建了一个仅由青色、黄色和洋红色组成的调色板。
//没用。
对于(int i=0,r=0,g=0,b=0;b=256)
{
r=0;
g++;
}
如果(g>=256)
{
g=0;
b++;
}
pbmi->bmiColors[i].rgr=字节(r);
pbmi->bmiColors[i].rgbGreen=字节(g);
pbmi->bmiColors[i].rgbBlue=字节(b);
pbmi->bmiColors[i].rgbReserved=BYTE(0);
r++;
}
//在这里,我试图基本上从000000到FFFFFF以六进制进行计数。
//导致访问冲突错误。
在将pbmi->bmiHeader.bibibitCount更改为16、24和32后,我也尝试了每一种方法,但都不起作用


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

如果试图创建简单的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);
        }
const int MaxIndex=255;
对于(int r=0;r[i]),rgbBlue=BYTE(b);
pbmi->bmiColors[i].rgbReserved=BYTE(0);
}

在您的示例中,
i
从何而来?它是如何递增的?在何处递增的?对不起,我忘记了te i,现在已修复。这将生成一个16MB的颜色表,这是完全冗余的。“调色板”中的颜色值最终只是从0(黑色)到16777215(白色)的表索引。对于真彩色图像,您不需要调色板。您需要检查相机的文档。每帧生成多少字节?每个图像为2752x2200,即6054400像素。因此(如果不准确,请更正我)我假设每个图像的大小为6054400*3字节。我正在查看文档。这是我正在使用的相机(AVT Prosilica GT2750C):相机规格说明它有6种不同的颜色模式。如果将其设置为
BGR8Packed
,则不需要调色板。还需要将
bibibibittcount
设置为24。
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);
        }