Die PictureBox ist eine praktische Sache. Bild laden, darauf malen und dann wieder speichern. NUR leider erlaubt diese ganz im Gegensatz zum Laden, wo sie GIF, JPG usw akzeptiert, beim Speichern nur das BMP-Format. Dieses ist z.B. im Bereich von Web & Co. absolut unbrauchbar. Es gibt im Web einige Ansätze mit Konvertierungstools. Einfacher und direkt geht es aber dank GDI+... Am besten man legt den folgenden Code in eine neue Modul-Datei: Option Explicit ' Zunächst die nötigen Deklarationen Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private Type GdiplusStartupInput GdiplusVersion As Long DebugEventCallback As Long SuppressBackgroundThread As Long SuppressExternalCodecs As Long End Type Private Type EncoderParameter GUID As GUID NumberOfValues As Long type As Long Value As Long End Type Private Type EncoderParameters Count As Long Parameter As EncoderParameter End Type Private Declare Function GdiplusStartup Lib "GDIPlus" ( _ token As Long, _ inputbuf As GdiplusStartupInput, _ Optional ByVal outputbuf As Long = 0) As Long Private Declare Function GdiplusShutdown Lib "GDIPlus" ( _ ByVal token As Long) As Long Private Declare Function GdipCreateBitmapFromHBITMAP Lib "GDIPlus" ( _ ByVal hbm As Long, _ ByVal hpal As Long, _ Bitmap As Long) As Long Private Declare Function GdipDisposeImage Lib "GDIPlus" ( _ ByVal Image As Long) As Long Private Declare Function GdipSaveImageToFile Lib "GDIPlus" ( _ ByVal Image As Long, _ ByVal Filename As Long, _ clsidEncoder As GUID, _ encoderParams As Any) As Long Private Declare Function CLSIDFromString Lib "ole32" ( _ ByVal str As Long, _ id As GUID) As Long Nun zur eigentlichen Routine: Public Sub Save_JPG( _ ByVal pict As StdPicture, _ ByVal filename As String, _ Optional ByVal quality As Byte = 200) Dim tSI As GdiplusStartupInput Dim lRes As Long Dim lGDIP As Long Dim lBitmap As Long ' GDI+ initalisieren tSI.GdiplusVersion = 1 lRes = GdiplusStartup(lGDIP, tSI) If lRes = 0 Then ' Erstelle GDI+ Bitmap aus dem Image Handler lRes = GdipCreateBitmapFromHBITMAP(pict.Handle, 0, lBitmap) If lRes = 0 Then Dim tJpgEncoder As GUID Dim tParams As EncoderParameters ' Initialiseren des Encoders CLSIDFromString StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder ' Nun die Parametrierung... tParams.Count = 1 With tParams.Parameter ' Quality ' Quality GUID festlegen CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .GUID .NumberOfValues = 1 .type = 4 .Value = VarPtr(Quality) End With ' Speichern des Bildes lRes = GdipSaveImageToFile(lBitmap, StrPtr(Filename), tJpgEncoder, tParams) ' Zerstören des Bildes GdipDisposeImage lBitmap End If ' GDI+ deinitalisieren GdiplusShutdown lGDIP End If If lRes Then Err.Raise 5, , "Speicherung des Bildes fehlgeschlagen. GDI+ Error:" & lRes End If End Sub Um nun den Inhalt einer PictureBox zu speichern, benutzt man einfach folgenden Code: Dim IMG_Container As New StdPicture ' .Picture, wenn nur das 'Hintergrundbild' gespeichert werden soll Set IMG_Container = PictureBox1.Image Save_JPG IMG_Container, "C:\TEST.JPG", 100 Will man Informationen, welche mit den Methoden PSet, Line usw in die PictureBox gezeichnet wurden, mitspeichern, benutzt man den Property .Image bei der Variablenzuweisung in das StdPicture Objekt. Hier ist es wichtig darauf zu achten, dass die AutoRedraw-Eigenschaft der PictureBox auf True gesetzt ist. Will man nur das zuvor geladene Bild ohne das eigene Kunstwerk sichern, ist das Property .Picture zu verwenden. Der Parameter "quality" erlaubt die Einstellung der vom JPEG bekannten Qulitäts-Kompressionsrate: 0 = maximale Kompression, geringe Bildqualität Sollte beim Speichern etwas schief gelaufen sein, erfährt man dies über den Errorcode... Allgemeines zum JPG-Format: Einige weitere nützliche Hinweise zur JPG-Kompression:
Weiter ist bei der Distribution der eigenen Software darauf zu achten, dass GDI+ erst ab W2k per Standard unterstützt wird. Ältere Betriebssysteme müssen nachgerüstet werden! Dieser Tipp wurde bereits 30.802 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 sevGraph (VB/VBA) Grafische Auswertungen Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |