VB 5/6-Tipp 0556: Bitmap in einen String umwandeln
von Philipp
Beschreibung
Mit dem folgenden Code ist es möglich ein Bitmap aus einer
PictureBox in einen String zu packen (Mit Größenangaben)
den man dann etwa über Winsock versenden könnte um ihn dann in ein Bild zu verwandeln.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: RtlMoveMemory (CopyMemory), GetBitmapBits, GetObjectA (GetObject), SetBitmapBits | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '---------- Anfang Projektdatei BitmapToString.vbp ---------- '----- Anfang Formular "Form1" alias BitmapToString.frm ----- ' Steuerelement: Bildfeld-Steuerelement "Picture2" ' Steuerelement: Schaltfläche "Command2" ' Steuerelement: Schaltfläche "Command1" ' Steuerelement: Bildfeld-Steuerelement "Picture1" ' Steuerelement: Figur-Steuerelement "Shape1" ' 'Autor: Philipp <pclaves@web.de> ' ' Folgende Einstellungen sind Notwendig: ' Me.ScaleMode = vbPixels ' Picture2.BorderStyle = 0 Option Explicit Private Declare Function GetBitmapBits Lib "gdi32" _ (ByVal hBitmap As Long, ByVal dwCount As Long, _ lpBits As Any) As Long Private Declare Function SetBitmapBits Lib "gdi32" _ (ByVal hBitmap As Long, ByVal dwCount As Long, _ lpBits As Any) As Long Private Declare Function GetObject Lib "gdi32" Alias _ "GetObjectA" (ByVal hObject As Long, ByVal nCount _ As Long, lpObject As Any) As Long Private Declare Sub CopyMemory Lib "kernel32.dll" Alias _ "RtlMoveMemory" (Destination As Any, Source As Any, _ ByVal Length As Long) Private Type BITMAP bmType As Long bmWidth As Long bmHeight As Long bmWidthBytes As Long bmPlanes As Integer bmBitsPixel As Integer bmBits As Long End Type Dim Data As String 'Der wichtige String, mit der Bitmap datei Private Function GetBitmapData() As String 'Aus der Bitmap den String erstellen 'Deklarationen der Informationen Dim BitmapData As String Dim BitmapHeight As Long Dim strBitmapHeight As String Dim BitmapWidth As Long Dim strBitmapWidth As String Dim BytesPerPixel As Integer Dim strBytesPerPixel As String Dim BitmapBytes As Long Dim BMP As BITMAP ' vom Typ BITMAP (siehe Deklarationsbereich) GetObject Picture1.Image.Handle, Len(BMP), BMP 'Übergabe des Objektes BitmapHeight = BMP.bmHeight 'Setzen der Eigenschaften BitmapWidth = BMP.bmWidth BytesPerPixel = (BMP.bmBitsPixel \ 8) BitmapBytes = BitmapHeight * BitmapWidth * BytesPerPixel BitmapData = Space$(BitmapBytes) GetBitmapBits Picture1.Image.Handle, BitmapBytes, ByVal BitmapData strBitmapHeight = Space$(4) CopyMemory ByVal strBitmapHeight, BitmapHeight, 4 strBitmapWidth = Space$(4) CopyMemory ByVal strBitmapWidth, BitmapWidth, 4 strBytesPerPixel = Space$(2) CopyMemory ByVal strBytesPerPixel, BytesPerPixel, 2 'String zusammenfügen und zurückgeben GetBitmapData = strBitmapHeight & strBitmapWidth & strBytesPerPixel & BitmapData End Function Private Sub SetBitmapData(Data As String) 'Aus dem String die Bitmap zurückerstellen 'Deklarationen der Informationen Dim BitmapData As String Dim BitmapHeight As Long Dim strBitmapHeight As String Dim BitmapWidth As Long Dim strBitmapWidth As String Dim BytesPerPixel As Integer Dim strBytesPerPixel As String Dim BitmapBytes As Long strBitmapHeight = Left$(Data, 4) strBitmapWidth = Mid$(Data, 5, 4) strBytesPerPixel = Mid$(Data, 9, 2) BitmapData = Mid$(Data, 11) CopyMemory BitmapHeight, ByVal strBitmapHeight, 4 CopyMemory BitmapWidth, ByVal strBitmapWidth, 4 CopyMemory BytesPerPixel, ByVal strBytesPerPixel, 2 Picture2.Height = BitmapHeight 'Die PicBox anpassen Picture2.Width = BitmapWidth BitmapBytes = BitmapHeight * BitmapWidth * BytesPerPixel 'Das Bild übergeben SetBitmapBits Picture2.Image.Handle, BitmapBytes, ByVal BitmapData Picture2.Refresh End Sub Private Sub Command1_Click() Data = GetBitmapData() 'String erstellen End Sub Private Sub Command2_Click() Call SetBitmapData(Data) 'String lesen End Sub Private Sub Form_Load() 'Notwendige Einstellungen Me.ScaleMode = vbPixels Picture2.BorderStyle = 0 End Sub '------ Ende Formular "Form1" alias BitmapToString.frm ------ '----------- Ende Projektdatei BitmapToString.vbp -----------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 9 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von vbDaniel am 23.12.2007 um 22:10
Du musst statt fso Open, Put und Close verenden
Kommentar von Jörg am 24.10.2007 um 19:38
Der Tip funktioniert prima.
Ich habe versucht den String in eine Textdatei zu speichern und dann aus der Datei wieder zu laden.
Leider wird das Bild nur halb oder garnicht dargestellt.
Data = GetBitmapData()
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.CreateTextFile(App.Path & "\" & "Bild.txt")
ts.Write Data
ts.Close
Der Inhalt von Data wird beim Speichern verfälscht.
Es gibt es eine Methode diese Daten unverfälscht zu speichern?
Kommentar von Eddy am 05.09.2007 um 21:52
Bei mir gehts nich! Es wird nur die größe der PictureBox2 verändert, das Bild wird aber nicht kopiert!?
Kommentar von Adrian Klinger am 17.10.2006 um 16:41
sehr guter tipp :-) Klasse
find ich gut das sich Leute an den Computer setzten und solche Tipps ins Internet stellen sehr gut prima :-)
Kommentar von Majid am 09.07.2006 um 11:22
guten tag
ich hbas mit ihrem tipp versucht und bekam immer fehler nummer "6, Überlauf".
und markiert wurde immer die stelle
BitmapBytes = BitmapHeight * BitmapWidth * BytesPerPixel
meine bildhöhe beträgt 5400 und die breite 6400
liegts vllt an der größe?
MfG
Majid
Kommentar von Thomas am 22.10.2005 um 22:52
Kann mir jemand den Sinn von CopyMemory erklären?
Da werden ja Values und Referenzen wild durchgemischt.
Kommentar von David Wohlfahrt am 24.06.2004 um 18:42
hi!
bei mir hats funktioniert. bin durch zufall hier drauf
gestoßen... hab leider keine verwendung dafür.
gruß
dw
Kommentar von Michael Gajda am 18.01.2003 um 15:13
1. können wir nicht hellsehen. ohne jedliche beschreibung, zusammenhang oder sontigen anhaltspunkt ist dein kommentar wertlos. formulier deine fragen genauer, gibt funktionen an oder fehlernummer, am besten posts du deinen code.
2. haben wir dazu das forum. solche fragen stellt man im forum, hier kann man meinungen/verbesserungen zu den tips posten.
gruß
michael
Kommentar von Günter am 02.01.2003 um 20:04
Hallo,
Dieser Tipp funktioniert nicht bei meiner Client-Server Anwendung.
Was mache ich verkehrt?
Danke für die Mühe