2008-10-13 76 views
9

Me gustaría cargar un archivo BMP, realizar algunas operaciones en la memoria y generar un nuevo archivo BMP usando C++ en Windows (Win32 nativo). Soy consciente de ImageMagick y es C++ vinculante Magick++, pero creo que es un exceso para este proyecto ya que actualmente no estoy interesado en otros formatos de archivos o plataformas.C++: ¿Cuál es la forma más sencilla de leer y escribir archivos BMP utilizando C++ en Windows?

¿Cuál sería la forma más simple en términos de configuración de código para leer y escribir archivos BMP? La respuesta puede ser "solo usa Magick ++, es el más simple".

pregunta relacionada: What is the best image manipulation library?

Respuesta

7

Al desarrollar específica para Windows por lo general sólo tiene que utilizar la clase ATL CImage

+0

creo CImage es parte de las clases/ATL MFC compartidos - que puede ser un poco más fácil para incluir entonces la clase CBitmap, que requiere MFC. – Aardvark

+1

Sí, solo necesita incluir atlimage.h – Gerald

+0

¿qué sucede si no está orientando solo a Windows? – JohnIdol

1

No he utilizado Magick ++, pero Windows tiene una biblioteca llamada de Windows Imaging Component que probablemente se adapte a sus necesidades.

2
#include <windows.h> 

LoadImage

+0

oh no, quiero decir incluir (nítido) "windows.h" pero falta parte de mi comentario – user27732

+0

He arreglado tu publicación y he añadido un enlace. Espero que no te importe. –

5

Un archivo BMP consta de 3 estructuras. A BITMAPFILEHEADER seguido de un BITMAPINFO seguido de una matriz de bytes.

La forma más simple de cargar un archivo BMP usando Win32 es llamar a CreateFile, GetFileSize, ReadFile y CloseHandle para cargar la imagen de archivo en la memoria, y luego simplemente lanzar un puntero al buffer a BITMAPFILEHEADER e ir desde allí.

Miento, una forma más simple es llamar a LoadImage. Asegúrese de pasar el indicador LR_DIBSECTION para asegurarse de que GDI no convierta la imagen cargada en la profundidad de bits en la que esté configurada su pantalla principal. Esto tiene la ventaja de obtener un HBITMAP que puede seleccionar en un DC y, por lo tanto, dibujar todo usando GDI.

Para guardarlo, sin embargo, no hay atajos. Necesita preparar un BITMAPFILEHEADER, escribirlo, completar una estructura BITMAPINFO, escribirla y luego los datos reales de los píxeles.

6

EasyBMP si solo quieres compatibilidad con bmp. Es lo suficientemente simple como para comenzar a usarlo en minutos, y es multiplataforma si lo necesitas.

1

Probé CImage como antes, pero tenía una matriz C llena de valores de píxeles que simplemente quería volcar como BMP (o cualquier otro formato). CImage no tiene constructor para eso, y no quise vincular MFC (para CBitmap) ni intentar comprender IWIC.

Lo que era fácil era CImg:

#include <cimg/cimg.h> 
using namespace cimg_library; 
//... 
void SaveMyData(uint8_t *pxarray, int width, int height) 
{ 
    CImg<uint8_t> img(pxarray, width, height); 
    img.save_bmp("sav.bmp"); 
} 
+0

Debo mencionar: no creo que use CImg en un producto. No me gusta el encabezado monolítico, ni tampoco arroja muchas advertencias. –

Cuestiones relacionadas