Holen Sie sich bytes aus HBITMAP
Wie kann ich mir ein Bild von bytes von hbitmap, wenn ich ein HBITMAP Zeiger, und meine Anwendung ist die Konsolenanwendung.
Ich habe versucht mit GetDIBits, die verlangen, dass solche parameter wie HDC, die ich nicht bekommen kann.
BEARBEITEN:
Ich lade bitmap aus Datei:
HBITMAP bm = 0;
BITMAP Bitmap;
bm = (HBITMAP)LoadImage (0, TEXT("C:\\img1.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
Ich pass HBITMAP, um die Funktion und erwarten, dass andere bekommen, HBITMAP von verarbeiteten Bild:
HBITMAP out1 = func(bm);
Where func:
HBITMAP func(HBITMAP im);
Und das problem ist, wie man Bild-bytes aus HBITMAP.
Haben Sie folgte Microsoft ' s Image Store Beispiel ?
Er erklärte, dass er versucht
Vergib mir meine Fehler zu link mit GetDIBits (), um die OP zu versuchen (und scheitern), um nach der vorgeschriebenen Methode zu tun, diese Aufgabe von der Microsoft-website. Ich habe nicht die Verbindung, und anscheinend ich sollte haben.
Ich glaube, die eigentliche Frage hier ist ", Was Sie beabsichtigen zu tun mit dem raw-bytes?" Wenn Sie möchten, schreiben Sie Sie auf ein PNG-Bild, oder etwas, Sie müssen zu bekommen, die Gerät-unabhängige Daten mit GetDIBits.
Reinhart habe ich auch einige, die Bildbearbeitung und dann das Ergebnis in eine neue HBITMAP Zeiger.
Er erklärte, dass er versucht
GetDIBits
aber nicht über einen DC-pass (wie das Beispiel, das Sie verbunden zeigt).Vergib mir meine Fehler zu link mit GetDIBits (), um die OP zu versuchen (und scheitern), um nach der vorgeschriebenen Methode zu tun, diese Aufgabe von der Microsoft-website. Ich habe nicht die Verbindung, und anscheinend ich sollte haben.
Ich glaube, die eigentliche Frage hier ist ", Was Sie beabsichtigen zu tun mit dem raw-bytes?" Wenn Sie möchten, schreiben Sie Sie auf ein PNG-Bild, oder etwas, Sie müssen zu bekommen, die Gerät-unabhängige Daten mit GetDIBits.
Reinhart habe ich auch einige, die Bildbearbeitung und dann das Ergebnis in eine neue HBITMAP Zeiger.
InformationsquelleAutor maximus | 2013-01-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Siehe neue Antwort da Frage bearbeitet wurde...
Können Sie dies tun, ohne einen handle auf den device context (
HDC
). Dies ist, weilGetDIBits
erwartet eineHBITMAP
dieEiner DDB ist eine Device-Dependent Bitmap, (im Gegensatz zu einer DIB-Datei, oder Device-Independent Bitmap). Das bedeutet:
Weshalb
GetDIBits
erfordert eineHDC
. Ansonsten kann die Farbe Informationen.Vielleicht eine gute Frage ist, wo hast du ein
HBITMAP
ohne eine begleitendeHDC
?Wenn Sie versuchen, diese bitmap im Speicher, können Sie als erstes nennen
CreateCompatibleDC
zum erstellen einer in-memory-DC kompatibel mit irgendeinem Gerät, dann CreateCompatibleBitmap mit der DC. Dann haben Sie eineHBITMAP
undHDC
zu arbeiten, wie Sie bitte. Andernfalls, wenn Sie nicht wissen, was IhrHBITMAP
verweist, können Sie nicht erwarten, etwas nützliches zu tun.Wenn Sie möchten, um Farbe, Informationen, ja. Blick auf den link, den ich auf enthalten DDBs.
Nur, wenn Sie es mit einem DDB, die abhängig ist auf eine
HDC
. Wenn Sie es mit einem DIB - statt, dann brauchen Sie nicht eineHDC
. Was macht also derHBITMAP
eigentlich Punkt-zu - a DDB oder DIB - ?Ich dachte, ein
HBITMAP
war immer ein DDB.HBITMAP
auf der MSDN-Website Punkte, die Sie zu dieser Seite, nach dem Bitmaps " Status "bitmap ist ein von der GDI-Objekte, die ausgewählt werden können, in eine device context (DC)"Reinhart, So ist es nicht möglich, eine bestehende HBITMAP mit einem neu erstellt mit HDC-wie von Ihnen beschrieben im Edit zu deiner Antwort?
InformationsquelleAutor Jonathon Reinhart
Der einfachste Weg ist nicht zu verwenden
GetDIBits
(nochGetBitmapBits
). Diese Funktionen saugen, weil Sie die Daten kopieren.Wenn Sie möchten, dass die Daten direkt, benutzen Sie einfach (für eine DDB bitmap)
Für ein DIB-bitmap verwenden
GetObject Informationen Finden Sie unter:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd144904%28v=vs.85%29.aspx
Diese wird nicht mit dem kopieren der Daten, so vermeidet die komplizierten Probleme, die im Zusammenhang mit GetDIBits, Siehe:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd144879%28v=vs.85%29.aspx
Esp. die Kommentare unten für eine Erklärung der Schwierigkeiten mit
GetDIBits
.Beachten Sie, dass Sie nicht Holen Sie sich die info-palette, aber da die meisten bitmaps sind 24 oder 32 bit wie auch immer, das ist kaum ein Problem die meisten der Zeit.
Nach dieser msdn.microsoft.com/en-us/library/dd144904(v=vs. 85).aspx, wenn bitmap nicht von
CreateDIBSection
bitmap.bmBit
Zeiger sind null.InformationsquelleAutor Johan
Da Sie mit
LoadImage
, um dieHBITMAP
ist, dann ist es in der Tat eine DIB (Device-Independent Bitmap) (Sie nennen es eine DIBsection). Sie haben jedoch nicht die Farbe.In diesem MSDN-HOWTO zeigt Ihnen, wie Sie die DIBsection in einem Speicher DC. Sie gehen dann auf die Verwendung
GetDIBColorTable
um die palette. Ich glaube jedoch, von dort aus mit, dass DC, die Sie verwenden könnenGetDIBits
, um die RGB-bitmap-Informationen, wie Sie versucht haben, zu tun.Hier ist der Allgemeine Kern von ihm:
Werden Sie bemerken in Ihrem code, dass
SelectObject
gibt einen handle auf das, was war in der DC. Sie dann wieder, dass vor dem AufrufDeleteDC
. Ich bin nicht sicher, ob seine wirklich notwendig, aber Sie tun es. Ich habe es hier für Klarheit.InformationsquelleAutor Jonathon Reinhart
Was für uns gearbeitet, ist diese: call
GetDIBits
während der richtige palette (falls indizierte Farben) noch ausgewählt ist, in den Gerätekontext. (Ohne palette ausgewählt, die Farben habe verstümmelt.)Aber in unserem Fall verwenden, es stellte sich heraus, dass DIB-Abschnitte durchgeführt, um einiges besser, so überprüfen Sie diese heraus, so gut und benchmark. Es gibt jedoch einige Fallstricke. Windows würde nicht mit der palette, wir rufen musste
SetDIBColorTable
vor der Verwendung. Aber das Gerät Kontext Bedarf noch ein einziger Eintrag (nur in schwarz) dummy-palette ausgewählt und realisiert in das Gerät Zusammenhang nichts anderes Windows wäre auch ignorieren die palette vonSetDIBColorTable
. BeideSetDIBColorTable
undRealizePalette
Bedarf vorhanden sein, sonst werden die Farben verzerrt.InformationsquelleAutor Anonymous
Können Sie versuchen, GetBitmapBits API-selbst in der Konsole. Mehr hier:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd144850%28v=vs.85%29.aspx
Nur pass HBITMAP handle und du bekommst deine bytes
aber es funktioniert einfach
Darüber hinaus, das ist immer das roh-bits, aber es ist noch eine device-dependent bitmap, so dass Sie nicht die richtige Farbe Informationen.
siehe meinen letzten Kommentar auf die OP.
Ich bekam Ihren Punkt, was OP steht für?
InformationsquelleAutor Vahid Farahmand