C ++: Quel est le moyen le plus simple de lire et d'écrire des fichiers BMP en utilisant C ++ sous Windows?

StackOverflow https://stackoverflow.com/questions/199403

Question

Je souhaite charger un fichier BMP, y effectuer quelques opérations en mémoire et générer un nouveau fichier BMP à l'aide de C ++ sous Windows (natif Win32). Je connais ImageMagick et sa liaison C ++ Magick ++ , mais je pense que c'est une surpopulation pour ce projet car je ne suis pas intéressé par d'autres formats de fichiers ou plates-formes.

Quel serait le moyen le plus simple en termes de configuration du code pour lire et écrire des fichiers BMP? La réponse peut être "utilisez simplement Magick ++, c'est la plus simple".

Question connexe: Quelle est la meilleure bibliothèque de manipulation d'images?

Était-ce utile?

La solution

Lors du développement uniquement pour Windows, j'utilise généralement l'ATL CImage classe

Autres conseils

EasyBMP si vous souhaitez uniquement une assistance bmp. C'est assez simple pour commencer à utiliser en quelques minutes, et c'est multiplateforme si vous en avez besoin.

Un fichier BMP est constitué de 3 structures. Un BITMAPFILEHEADER suivi d'un BITMAPINFO suivi d'un tableau d'octets.

La méthode la plus simple pour charger un fichier BMP à l’aide de Win32 consiste à appeler CreateFile, GetFileSize, ReadFile et CloseHandle pour charger l’image de fichier en mémoire, puis il suffit de lancer un pointeur sur la mémoire tampon vers BITMAPFILEHEADADER et de passer de là. / p>

Je mens, un moyen plus simple consiste à appeler LoadImage. Assurez-vous de passer l'indicateur LR_DIBSECTION pour vous assurer que GDI ne convertit pas l'image chargée dans la profondeur de bit pour laquelle votre affichage principal est configuré. Cela présente l’avantage de vous fournir un HBITMAP que vous pouvez sélectionner dans un contrôleur de domaine et que, par conséquent, utiliser partout avec GDI.

Cependant, il n’existe aucun raccourci pour le sauvegarder. Vous devez préparer un fichier BITMAPFILEHEADER, l'écrire, renseigner une structure BITMAPINFO, l'écrire, puis les données de pixels réelles.

La classe CBitmap est BMP I / O.

#include <windows.h>

LoadImage

Je n'ai pas utilisé Magick ++, mais Windows possède une bibliothèque appelée Windows Imaging Component qui conviendrait probablement à vos besoins.

J'ai essayé CImage comme ci-dessus, mais j'avais un tableau C plein de valeurs en pixels que je voulais simplement vider en tant que BMP (ou tout autre format). CImage n'a pas de constructeur pour cela, et je ne voulais pas lier MFC (pour CBitmap ) ni essayer de sonder IWIC.

Ce qui était facile, c’était 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");
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top