C ++: Qual è il modo più semplice per leggere e scrivere file BMP usando C ++ su Windows?
-
11-07-2019 - |
Domanda
Vorrei caricare un file BMP, fare alcune operazioni su di esso in memoria e produrre un nuovo file BMP usando C ++ su Windows (nativo Win32). Sono a conoscenza di ImageMagick e del suo legame C ++ Magick ++ , ma penso che sia eccessivo per questo progetto poiché al momento non sono interessato ad altri formati di file o piattaforme.
Quale sarebbe il modo più semplice in termini di impostazione del codice per leggere e scrivere file BMP? La risposta potrebbe essere " basta usare Magick ++, è la più semplice. & Quot;
Domanda correlata: Qual è la migliore libreria di manipolazione delle immagini?
Soluzione
Quando sviluppo solo per Windows di solito uso solo l'ATL CImage classe
Altri suggerimenti
EasyBMP se desideri solo il supporto bmp. È abbastanza semplice da iniziare a usarlo in pochi minuti, ed è multipiattaforma se ne avresti bisogno.
Un file BMP è composto da 3 strutture. Un BITMAPFILEHEADER seguito da un BITMAPINFO seguito da una matrice di byte.
Il modo più semplice per caricare un file BMP usando Win32 è chiamare CreateFile, GetFileSize, ReadFile e CloseHandle per caricare l'immagine del file in memoria, quindi semplicemente lanciare un puntatore al buffer su un BITMAPFILEHEADER e passare da lì.
Mentisco, un modo più semplice è chiamare LoadImage. Assicurati di passare il flag LR_DIBSECTION per assicurarti che GDI non converta l'immagine caricata in qualunque bitdepth su cui è configurato il tuo display principale. Questo ha il vantaggio di procurarti un HBITMAP che puoi selezionare in un DC e quindi disegnare ovunque usando GDI.
Per salvarlo, tuttavia, non esiste alcun collegamento. Devi preparare un BITMAPFILEHEADER, scriverlo, compilare una struttura BITMAPINFO, scriverlo e quindi i dati pixel effettivi.
La CBitmap fa BMP I / O.
#include <windows.h>
Non ho usato Magick ++, ma Windows ha una libreria chiamata Componente di imaging di Windows che probabilmente soddisfa le tue esigenze.
Ho provato CImage
come sopra, ma avevo un array C pieno di valori di pixel che volevo semplicemente scaricare come BMP (o qualsiasi altro formato). CImage
non ha alcun costruttore per questo, e non volevo collegare MFC (per CBitmap
) né cercare di capire IWIC.
Ciò che è stato facile è stato 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");
}