Visualizando imagen en niveles de gris

03/07/2004 - 00:07 por Willser F. González C. | Informe spam
Hola Grupo,

Tengo un archivo tipo RAW (plano), que contiene una imagen de 416 x 416 en
niveles de gris (8 bits por pixel) y estoy intentando mostrarla en pantalla,
pero la imagen se visualiza con colores extraños, aunque la imagen sí se
logra reconocer por su forma, pero no por sus colores. Creo que mi error
puede estar en la definición del BITMAPINFO o algo de la paleta de colores,
pero no encuentro alguna explicación al respecto.


CRect l_crCdroImgen;

BITMAPINFO l_biBitmapInfo;

l_biBitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
l_biBitmapInfo.bmiHeader.biWidth = m_sAnchoArchvo; // 416.
l_biBitmapInfo.bmiHeader.biHeight = -m_sAltoArchvo; // 416.
l_biBitmapInfo.bmiHeader.biPlanes = 1;
l_biBitmapInfo.bmiHeader.biBitCount = 8;
l_biBitmapInfo.bmiHeader.biCompression = BI_RGB; // Uncompressed.
Supongo que está bien.
l_biBitmapInfo.bmiHeader.biSizeImage = 0;
l_biBitmapInfo.bmiHeader.biXPelsPerMeter = 0;
l_biBitmapInfo.bmiHeader.biYPelsPerMeter = 0;
l_biBitmapInfo.bmiHeader.biClrUsed = 0;
l_biBitmapInfo.bmiHeader.biClrImportant = 0;

m_csCdroImgen.GetClientRect(l_crCdroImgen); // Reacuadro donde se
muestra la imagen. m_csCdroImgen es tipo Static.

// Con esta función muestro la imagen ajustada a un recuadro, pero no
conserva los colores correctos.

StretchDIBits(m_csCdroImgen.GetWindowDC()->m_hDC, // handle al DC
0, 0,
// origen del destino
l_crCdroImgen.Width(), l_crCdroImgen.Height(), //
ancho y alto del destino
0, 0,
// origen de la fuente
m_sAnchoArchvo,
// ancho fuente
m_sAltoArchvo,
// alto fuente
m_pucImgen,
// dirección del array de bits
&l_biBitmapInfo,
// dirección de BITMAPINFO
DIB_RGB_COLORS, SRCCOPY); //
colores RGB -

Les agradezco cualquier sugerencia al respecto.

Willser F.
 

Leer las respuestas

#1 Miguel
03/07/2004 - 03:42 | Informe spam
"Willser F. González C." escribía:


Hola Grupo,

Tengo un archivo tipo RAW (plano), que contiene una imagen de 416 x 416 en
niveles de gris (8 bits por pixel) y estoy intentando mostrarla en pantalla,
pero la imagen se visualiza con colores extraños, aunque la imagen sí se
logra reconocer por su forma, pero no por sus colores. Creo que mi error
puede estar en la definición del BITMAPINFO o algo de la paleta de colores,
pero no encuentro alguna explicación al respecto.


CRect l_crCdroImgen;

BITMAPINFO l_biBitmapInfo;

l_biBitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
l_biBitmapInfo.bmiHeader.biWidth = m_sAnchoArchvo; // 416.
l_biBitmapInfo.bmiHeader.biHeight = -m_sAltoArchvo; // 416.
l_biBitmapInfo.bmiHeader.biPlanes = 1;
l_biBitmapInfo.bmiHeader.biBitCount = 8;
l_biBitmapInfo.bmiHeader.biCompression = BI_RGB; // Uncompressed.
Supongo que está bien.
l_biBitmapInfo.bmiHeader.biSizeImage = 0;
l_biBitmapInfo.bmiHeader.biXPelsPerMeter = 0;
l_biBitmapInfo.bmiHeader.biYPelsPerMeter = 0;
l_biBitmapInfo.bmiHeader.biClrUsed = 0;
l_biBitmapInfo.bmiHeader.biClrImportant = 0;

m_csCdroImgen.GetClientRect(l_crCdroImgen); // Reacuadro donde se
muestra la imagen. m_csCdroImgen es tipo Static.

// Con esta función muestro la imagen ajustada a un recuadro, pero no
conserva los colores correctos.

StretchDIBits(m_csCdroImgen.GetWindowDC()->m_hDC, // handle al DC
0, 0,
// origen del destino
l_crCdroImgen.Width(), l_crCdroImgen.Height(), //
ancho y alto del destino
0, 0,
// origen de la fuente
m_sAnchoArchvo,
// ancho fuente
m_sAltoArchvo,
// alto fuente
m_pucImgen,
// dirección del array de bits
&l_biBitmapInfo,
// dirección de BITMAPINFO
DIB_RGB_COLORS, SRCCOPY); //
colores RGB -

Les agradezco cualquier sugerencia al respecto.

Willser F.




Pero... ¿está completo el BITMAPINFO? Digo, la paleta dónde está. Los
256 RGBQUADŽs contiguos al BITMAPINFOHEADER, con la escala de grises

{0x00000000, 0x00010101, 0x00020202, ..., 0x00FEFEFE, 0x00FFFFFF};

Da la impresión que la función está levantando 1KB de basura y lo está
interpretando como la paleta que no le estás proveyendo...

Digo, da la impresión.

LPBITMAPINFO bmi = LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER) + \
256 * sizeof(RGBQUAD));

bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
...
bmi->bmiColors[] = {...};

...

...
LocalFree(bmi);

Saludos

Miguel

Preguntas similares