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?

È stato utile?

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>

LoadImage

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");
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top