2008-10-13 8 views
9

Ich möchte eine BMP-Datei laden, einige Operationen im Speicher ausführen und eine neue BMP-Datei mit C++ unter Windows (Win32 native) ausgeben. Ich kenne ImageMagick und es ist C++ verbindlich Magick++, aber ich denke, es ist ein Overkill für dieses Projekt, da ich derzeit nicht an anderen Dateiformaten oder Plattformen interessiert bin.C++: Was ist der einfachste Weg zum Lesen und Schreiben von BMP-Dateien mit C++ unter Windows?

Was wäre der einfachste Weg in Bezug auf Code-Setup zum Lesen und Schreiben von BMP-Dateien? Die Antwort könnte lauten: "Benutze einfach Magick ++, es ist das Einfachste."

Verwandte Frage: What is the best image manipulation library?

Antwort

7

Wenn nur für Windows Entwicklung verwende ich in der Regel nur die ATL CImage Klasse

+0

Ich denke, CImage Teil der gemeinsam genutzten MFC/ATL-Klassen ist - was ein wenig leichter sein, kann dann die CBitmap-Klasse, die MFC erfordert aufzunehmen. – Aardvark

+1

Ja, Sie müssen nur atlimage.h einbeziehen – Gerald

+0

Was ist, wenn Sie nicht nur auf Windows ausgerichtet sind? – JohnIdol

1

Ich habe nicht Magick ++ verwendet, aber Windows verfügt über eine Bibliothek, die Windows Imaging Component genannt, die Ihren Bedürfnissen wahrscheinlich passen würde.

2

Die Klasse CBitmap führt BMP-E/A durch.

2
#include <windows.h> 

LoadImage

+0

oh nein, ich meine zu sagen (sharp) "windows.h" aber ein Teil meines Kommentars fehlt – user27732

+0

Ich habe Ihren Beitrag repariert und Link hinzugefügt. Hoffe, es macht Ihnen nichts aus. –

5

Eine BMP-Datei von 3 Strukturen besteht. Ein BITMAPFILEHEADER gefolgt von einem BITMAPINFO, gefolgt von einem Array von Bytes. Die einfachste Möglichkeit zum Laden einer BMP-Datei mit Win32 ist das Aufrufen von CreateFile, GetFileSize, ReadFile und CloseHandle, um das Dateiimage in den Arbeitsspeicher zu laden, und dann einen Zeiger auf den Buffer zu einem BITMAPFILEHEADER zu werfen und von dort aus zu gehen.

Ich liege, ist ein einfacher Weg, LoadImage aufzurufen. Stellen Sie sicher, dass das Flag LR_DIBSECTION übergeben wird, um sicherzustellen, dass GDI das geladene Image nicht in die Bittiefe konvertiert, für die Ihre primäre Anzeige konfiguriert ist. Dies hat den Vorteil, dass Sie eine HBITMAP erhalten, die Sie in einen DC auswählen können und daher mit GDI zeichnen.

Um es zu speichern, gibt es jedoch keine Verknüpfung. Sie müssen einen BITMAPFILEHEADER vorbereiten, ausschreiben, eine BITMAPINFO-Struktur ausfüllen, diese ausschreiben und dann die tatsächlichen Pixeldaten.

6

EasyBMP wenn Sie nur BMP Unterstützung möchten. Es ist einfach genug, um innerhalb von Minuten zu verwenden, und es ist Multiplattform, wenn Sie das brauchen würden.

1

Ich versuchte wie oben, aber ich hatte ein C-Array voller Pixel-Werte, die ich einfach als BMP (oder ein anderes Format) ausgeben wollte. CImage hat keinen Konstruktor dafür, und ich wollte nicht MFC (für CBitmap) verknüpfen oder versuchen, IWIC zu ergründen.

Was einfach war, war 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"); 
} 
+0

Ich sollte erwähnen: Ich glaube nicht, dass ich CImg in einem Produkt verwenden würde. Ich mag den monolithischen Header nicht, noch dass er viele Warnungen gibt. –