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.

Preguntas similare

Leer las respuestas

#6 Willser F. González C.
07/07/2004 - 23:12 | Informe spam
Creo que estoy reservando más memoria de la que necesito, así que como bien
lo escribió Miguel, la memoria se debe reservar con LocalAlloc(...) así:

BITMAPINFO *l_pbiBitmapInfo = (BITMAPINFO *) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));

en lugar de:

BITMAPINFO *l_pbiBitmapInfo = new BITMAPINFO[sizeof(BITMAPINFOHEADER) +
256 * sizeof(RGBQUAD)];

y liberar con:

LocalFree(l_pbiBitmapInfo),

en lugar de:

delete l_pbiBitmapInfo;


Willser F.
Respuesta Responder a este mensaje
#7 Willser F. González C.
07/07/2004 - 23:53 | Informe spam
OK Miguel, la imagen a 24 bits se muestra, pero los colores se visualizan
como invertidos, por ejemplo en lugar de azul, muesta como un color
zanahoria; en lugar de amarillo muestra azul; aunque las porciones en negro
y/o blanco sí se muestran correctamente.

Este es la parte del código:

l_pbiBitmapInfo = (BITMAPINFO *) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER)); // Sin "+ sizeof(RGBQUAD)".

l_pbiBitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
l_pbiBitmapInfo->bmiHeader.biWidth = m_sAnchoArchvo;
l_pbiBitmapInfo->bmiHeader.biHeight = -m_sAltoArchvo;
l_pbiBitmapInfo->bmiHeader.biPlanes = 1;
l_pbiBitmapInfo->bmiHeader.biBitCount = 24;
l_pbiBitmapInfo->bmiHeader.biCompression = BI_RGB;

// Cuál es la utilidad de estos 5 parámetros?.

l_pbiBitmapInfo->bmiHeader.biSizeImage = 0;
l_pbiBitmapInfo->bmiHeader.biXPelsPerMeter = 0;
l_pbiBitmapInfo->bmiHeader.biYPelsPerMeter = 0;
l_pbiBitmapInfo->bmiHeader.biClrUsed = 0;
l_pbiBitmapInfo->bmiHeader.biClrImportant = 0;

m_csCdroImgen.GetClientRect(l_crCdroImgen);

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_pbiBitmapInfo, // Dirección del BITMAPINFO.
DIB_RGB_COLORS, SRCCOPY); // Colores RGB.

Willser F.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida