txt manejo lenguaje leer lectura guardar escritura ejercicios ejemplos datos crear archivos archivo c++ windows winapi image-manipulation bmp

manejo - C++: ¿Cuál es la forma más sencilla de leer y escribir archivos BMP utilizando C++ en Windows?



manejo de archivos en c pdf (7)

Al desarrollar solo para Windows, suelo usar la clase ATL CImage

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 se trata de C ++ vinculante Magick ++ , pero creo que es un exceso para este proyecto ya que actualmente no estoy interesado en otros formatos de archivo o plataformas.

¿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: ¿Cuál es la mejor biblioteca de manipulación de imágenes?



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


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 del archivo en la memoria, y luego simplemente lanzar un puntero al buffer a un 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.



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


CImage con CImage como el anterior, 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 un constructor para eso, y yo no quería vincular MFC (para CBitmap ) ni tratar de comprender IWIC.

Lo que fue fácil fue 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"); }