C ++: Quel est le moyen le plus simple de lire et d'écrire des fichiers BMP en utilisant C ++ sous Windows?
-
11-07-2019 - |
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?
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>
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");
}