Speichern HBITMAP *.bmp Datei mit nur Win32
Habe ich ein HBITMAP in meinem reinen Win32-Projekt (keine externen Bibliotheken verwendet werden). Kann ich es exportieren in eine *.bmp-Datei, die nur mithilfe von Winapi und/oder CRT-Funktionen, so glaube ich nicht, entstehen Ihnen keine zusätzlichen Abhängigkeiten?
InformationsquelleAutor sashoalm | 2014-07-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine API zum speichern in die Datei direkt da, in der Regel, dass ein bitmap-handle bedeutet nicht, Sie haben direkten Zugriff auf die bitmap-Daten. Ihre Lösung: kopieren Sie die bitmap in ein anderes bitmap mit Zugang zu den Daten (DIB) und dann mit es-Daten zum schreiben in die Datei.
Sie in der Regel erstellen Sie entweder ein anderes bitmap mit
CreateDIBSection
oder Sie bekommen bitmap-Daten mitGetDIBits
.CreateFile
,WriteFile
schreibt Daten in die Datei.Schreiben Sie:
BITMAPFILEHEADER
, dannBITMAPINFOHEADER
, dann palette (die Sie normalerweise nicht haben, wenn bits/pixel auf 8), dann werden die Daten selbst.Siehe auch:
Den Code
Dies ist der code aus der MSDN-Artikel (Hinweis, dass Sie brauchen, um zu definieren, die
errhandler()
- Funktion):HBITMAP
zimmerreserviereung, ohne das Sie manuell konvertieren. Es dauert ein bisschen code zu erstellen Sie einen stream auf eine Datei, erstellen Sie ein encoder, und dann dumping frames hinein. Aber die heavy-lifting erfolgt in IWICImagingFactory::CreateBitmapFromHBITMAP und der IWICBitmapEncoder, so dass Sie nicht haben, um Geige mit bitmap-Header.InformationsquelleAutor Roman R.
Noch eine weitere minimalistische option ist die Verwendung von OLE -
IPicture
. Es war schon immer rund um, immer noch ein Teil des Win32-API:hBitmap
impictdesc.bmp.hbitmap = hBitmap;
scheint schwarzarbeit. Haben Sie eine Idee haben, wie Sie zu beheben?ist das, was Sie bereits haben, nach OP ' s Frage, von
HBITMAP
geben. Dies ist ein Win32-handle auf das bitmap, welche Inhalte Sie möchten, um eine Datei zu speichern.Es ist meine Schuld. Habe ich nicht gelesen voll OP ' s Frage. Alles, was er will, ist der Export. Also im Grunde, er hat eine
bitmap
schon. Danke!InformationsquelleAutor noseratio
lasse ich diese selbst enthalten, proof-of-concept, seit ich hier wahrscheinlich benötigen, um es so Aussehen, bis später, da es nicht offensichtlich ist. Es nimmt einen screenshot des desktop-Fensters und speichert es in bitmap.bmp:
Speichern bmp-Datei auf Laufwerk " D " verwenden CreateBMPFile("D:\\bitmap.bmp", hbitmap);
Es ist ein Fehler, der sagt:
uninitialized local variable 'bmp' used
. Der code bereits deklariertBITMAP bmp
. Warum?meine Vermutung ist, weil Sie kompilieren Sie c++ - compiler oder eine andere compiler. Ich kann nicht sagen, ohne Ihnen zu sagen, welche Linie der Warnung, aber es ist in der Tat initialisiert mithilfe von GetObject und überprüft, ob GetObject erfolgreich war oder nicht.
Ich bin mit MSVS C++ - compiler, um diesen code zu kompilieren.
InformationsquelleAutor Dmitry
Ja, das ist möglich, mit dem Windows Imaging Component (WIC). WIC bietet integrierte Encoder, so dass Sie nicht haben, um manuell zu schreiben, die bitmap-Header und Daten. Es erlaubt Ihnen auch, wählen Sie einen anderen encoder (z.B. PNG), und ändern Sie so wenig wie eine Zeile code.
Der Prozess ist ziemlich geradlinig. Es besteht aus den folgenden Schritten:
HBITMAP
mitGetObject
(Abmessungen, bit-Tiefe).IWICImagingFactory
Instanz.IWICBitmap
Instanz aus derHBITMAP
(IWICImagingFactory::CreateBitmapFromHBITMAP
).IWICStream
Instanz (IWICImagingFactory::CreateStream
), und befestigen Sie es an eine mit dem Namen (IWICStream::InitializeFromFilename
).IWICBitmapEncoder
Instanz (IWICImagingFactory::CreateEncoder
), und verbinden es mit dem stream (IWICBitmapEncoder::Initialize
).IWICBitmapFrameEncode
Instanz (IWICBitmapEncoder::CreateNewFrame
), und initialisieren Sie es in übereinstimmung mit der QuelleHBITMAP
(IWICBitmapFrameEncode::Initialize
,IWICBitmapFrameEncode::SetSize
,IWICBitmapFrameEncode::SetPixelFormat
).IWICBitmapFrameEncode::WriteSource
).IWICBitmapFrameEncode::Commit
,IWICBitmapEncoder::Commit
).Übersetzt-code:
Hier ist eine companion-test Anwendung zu präsentieren, die Nutzung. Stellen Sie sicher, dass
#define OEMRESOURCE
vor jedem system-Header zu ermöglichen, der Nutzung derOBM_
Bilder.Diese laden einen vom system bereitgestellten bitmap und speichern angegebene Pfadname als argument auf der Befehlszeile.
Einschränkungen:
HBITMAP
bezieht sich auf eine bitmap mit alpha-Kanal, noch würde ich wissen, wie, um zu bestimmen, ob es ein vor-multipliziert. Wenn Sie wollen, unterstützen einen alpha-Kanal, stellen Sie sicher, dass dieEnableV5Header32bppBGRA
EigenschaftVARIANT_TRUE
(siehe BMP-Format: Codierung).HPALETTE
im AufrufIWICImagingFactory::CreateBitmapFromHBITMAP
.GUID_WICPixelFormat24bppBGR
pixel-format Konstante. Ein vielseitiger Implementierung ableiten, kompatibel, pixel-format von der QuelleHBITMAP
.InformationsquelleAutor IInspectable