Pregunta

Me gustaría cargar un archivo BMP, realizar algunas operaciones en él en la memoria y generar un nuevo archivo BMP usando C ++ en Windows (Win32 nativo). Soy consciente de ImageMagick y su enlace en C ++ Magick ++ , pero creo que es una exageración para este proyecto ya que actualmente no estoy interesado en otros formatos o plataformas de archivos.

¿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 "simplemente use Magick ++, es la más simple".

Pregunta relacionada: ¿Cuál es la mejor biblioteca de manipulación de imágenes?

¿Fue útil?

Solución

Cuando desarrollo solo para Windows, generalmente uso el ATL CImage class

Otros consejos

EasyBMP si solo desea soporte bmp. Es lo suficientemente simple como para comenzar a usarlo en cuestión de minutos, y es multiplataforma si lo necesita.

Un archivo BMP consta de 3 estructuras. Un 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 búfer a un BITMAPFILEHEADER y continuar desde allí.

Miento, una forma más simple es llamar a LoadImage. Asegurándose 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 con GDI.

Sin embargo, para guardarlo, no hay acceso directo. Debe preparar un BITMAPFILEHEADER, escribirlo, completar una estructura BITMAPINFO, escribir eso y luego los datos de píxeles reales.

La clase CBitmap hace BMP I / O.

#include <windows.h>

LoadImage

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

Intenté CImage como se indicó anteriormente, 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 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");
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top