Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0556: Bitmap in einen String umwandeln

 von 

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:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

RtlMoveMemory (CopyMemory), GetBitmapBits, GetObjectA (GetObject), SetBitmapBits

Download:

Download des Beispielprojektes [17,03 KB]

'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-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

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