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
Dieser ist, arbeitet auch.
Wow. Wenn nur die akzeptierte Antwort, funktioniert auf jedem von uns dann, warum es gibt viele mögliche Antworten zur Verfügung gestellt? Wir sind hier um zu helfen, die ppl, die versuchen, eine Antwort zu finden, wird Arbeit auf Sie.
Die eine Sache. Diese Antwort wurde gebeten, vor 8 Jahren im social.msdn.microsoft.com/Forums/en-US/... und der OP ' s Frage wurde bereits vor 4 Jahren. Achten Sie auf Ihre
Plagiarized
Sache. Ich will einfach nur, um zu helfen."ich will nur helfen." - Nichts falsch mit, dass. Aber wenn Sie nicht hilft, sollten Sie diszipliniert genug, um es nicht zu versuchen. Die Frage ist zu Fragen, wie man zum schreiben einer bitmap, referenziert durch eine
HBITMAP
auf der Festplatte. Der code, den Sie präsentiert nicht erreichen, dass. Es versucht, konvertieren Sie die bitmap in ein format, das es weiß, wie es zu schreiben. Und er macht es falsch, zu. Es ist das Undefiniertes Verhalten, wenn Sie versuchen zudelete pData;
,bfSize
ist falsch berechnet, Speicher fürpHeader
ist ausgelaufen, und viele andere Probleme kann ich keine Adresse in einem einzigen Kommentar. Diese vorgeschlagene Antwort ist einfach nicht hilfreich.Okay. Mein Fehler, danke sir für die Erklärung. Ich glaube, ich brauche, um c++ - Bücher. Müssen tief Graben. 😉
InformationsquelleAutor JAMES BRYAN B. Juventud