Wie würde ich zeichnen Sie ein PNG-Bild mit LoadImage und StretchDIBits?
(Dies ist im Zusammenhang mit der Frage auf Wie würde ich das laden eines PNG Bildes mit Win32/GDI (kein GDI+, wenn möglich)?.)
Hallo alle,
Ich Frage mich, wenn Sie eine PNG-Ressource eingebettet in eine binäre Datei mit der ID IDB_PNG1
, und ein LPDRAWITEMSTRUCT
zu ziehen (so, dass bedeutet, Sie haben die HDC
und das Rechteck für dein Ziel), wie zeichnen Sie das Bild auf dem Bildschirm mit StretchDIBits
? Ich habe mit BitBlt
und TransparentBlt
vor, aber StretchDIBits
scheint zu funktionieren unterschiedlich, und LoadImage
scheint nicht zu funktionieren mit PNG.
Danke!
(Hinweis: die Sprache, Die ich stellen, ist C++, aber das ist nicht allzu wichtig... C, C#, Visual Basic, usw. wäre in Ordnung; ich versuche nur, um herauszufinden, die Schritte, nicht den genauen code notwendig).
InformationsquelleAutor Mehrdad | 2010-12-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass die PNG-support-inside-bitmaps ist nur dann wirklich zur Verwendung von Drucker-Treibern. Für den Bildschirm werden Sie wahrscheinlich haben, um Dekomprimieren Sie die PNG-Daten selbst mit etwas code wie libpng.
Drucker in der Regel (zumindest historisch gesehen) haben deutlich mehr Fähigkeiten als display-Adapter. Drucker sind auch über verbindungen mit geringerer Bandbreite, also ökonomie der bits ist wichtig in senden von Daten an einen Drucker (es ist besser, senden Sie ein komprimiertes PNG zu einem Drucker, der die Fähigkeit hat, Sie zu entschlüsseln, als senden alle roh-bits). Dies erlaubt es auch, den Drucker zu wählen, die am besten geeignete fidelity Optionen, wenn es funktioniert die Dekompression selbst. Jedoch, Anzeige-hardware und-Treiber in der Regel wollen mehr deterministisch und vermeiden Sie tun Dekompression selbst.
Wie funktioniert die Funktion wissen, ob es für ein Drucker eher als ein display?
Die Funktion übergibt Ihre Daten an den Fahrer. Der Fahrer kann entweder anzeigen, oder sagen "sorry, weiß nicht, wie das zu tun".
Ja... Laut der MSDN-Website: "Auf bestimmten Versionen von Microsoft Windows, die
StretchDIBits
undSetDIBitsToDevice
Funktionen ermöglichen es, JPEG-und PNG-Bilder, die übergeben werden, wie die Quelle Bild-zu-Drucker-Geräte." Danke für die Antwort!InformationsquelleAutor Greg Hewgill
Schrieb ich eine blog-post (auf die Anzeige eines splash-screen mit C++), enthält eine vollständige code-Beispiel, lädt ein PNG aus einer Quelle, und wandelt es in ein HBITMAP (mit WIC). Sie könnte dann mit CreateCompatibleDC, SelectObject und BitBlt, um ihn in das Ziel HDC.
Während ich habe nie versucht es, Sie sollten in der Lage sein, mit StretchDIBits zum anzeigen der PNG nicht direkt auf, wenn Sie laden Sie die raw-bytes, die von der Ressource in den Speicher, und richten Sie eine BITMAPINFOHEADER-Struktur mit der Breite, Höhe, usw. wie gezeigt, in diesem MSDN-Beispiel.
C# und VB.NET Lösungen wäre ganz anders, da könnten Sie System.Zeichnung (ein wrapper für GDI+) oder System.Windows.Media.Bildgebung (in einer WPF-Anwendung) zu handhaben das Bild laden und zeichnen.
BITMAPINFOHEADER
: wie würde ich wissen, was die Dimensionen des Bildes sind? Wäre ich noch gezwungen, WIC? (Edit: wie Es scheint, würde dies nicht funktionieren; siehe mein Kommentar auf Greg ' s post. Aber danke sehr für den link zu den blog-post, es werden die meisten auf jeden Fall hilfreich sein... ich wünschte, ich könnte Sie markieren zwei Beiträge als Antwort. 🙂 )Zu wissen, die Abmessungen des Bildes, Sie würde entweder schreiben Sie eine png-decoder (oder verwenden Sie libpng oder WIC) Lesen Sie aus der PNG-Datei, oder speichern Sie Sie als separate Ressource, die immer in sync mit Ihrer PNG-Ressource. (Das ist teilweise, warum ich habe nie versucht, die StretchDIBits Ansatz; ich habe immer verwendet libpng oder WIC, Griff alle die PNG Lesen.)
InformationsquelleAutor Bradley Grainger