Как мне изменить эту палитру серого в палитру цветов?

Я получаю изображения с помощью цифровой камеры. Сначала я использовал монокамеру, но недавно я перешел на цветную камеру. С монокамерой у меня были некоторые проблемы с палитрой, пока я не нашел этот кусочек кода, чтобы изменить палитру на палитру в оттенках серого:

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 — это битмапинфо *.

Это работало просто отлично для моно камеры. Но теперь с цветной камерой я явно не хочу делать изображения в градациях серого. Однако, если я удаляю этот кусок кода, у меня возникают те же проблемы с палитрой, которые у меня были раньше с монокамерой. Поэтому мне кажется, что мне нужно сделать нечто подобное, как я делал раньше, и создать палитру, только на этот раз палитру цветов.

Для справки, вот остальные настройки 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?

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);
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]