Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Bitmap mit Excel auslesen?

Bitmap mit Excel auslesen?
23.02.2008 17:46:35
pweksictul
Ich habe ein recht exotisches Anliegen: Ich möchte viele Bitmaps auslesen und die Farbwerte für jedes Pixel in eine Tabelle schreiben. Die Bitmaps, die ich bearbeiten muss, sind schwarz/weiß, haben 16 bit Farbtiefe und jeweils eine Größe von 1024x768. Ich muss eigentlich nur wissen wo das erste nicht weiße Pixel steht (links oben). Bei Wikipedia habe ich gelesen, dass das Dateiformat sehr simpel sei. Nun stelle ich mir vor, man könnte vielleicht mit open und get per Excel was erreichen ...

Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bitmap mit Excel auslesen?
23.02.2008 18:11:00
pweksictul
Habe inzwischen dies hier gefunden (ok, ich hätte auch erst suchen können). Mir ist aber nicht klar, ob das auch in Excel geht.
http://www.vbarchiv.net/archiv/tipp_770.html
Werd mal was probieren, bin aber trotzdem über jeden Rat froh!

Anzeige
AW: Bitmap mit Excel auslesen?
23.02.2008 19:03:00
Christoph
Hallo,
schau dir mal die folgende Seite an:
http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/tipps/tip0253.shtml
bzw:
http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/tipps/tip0173.shtml
Da siehst du wie der Header aufgebaut ist.
Beachte:
- 54 Byte für den Header
- Anschließend die Pixel, aber unterste PixelLinie zuerst (von links nach rechts).
- Eine PixelLinie ist immer ein Vielfaches von 4 Byte.
- Ein Pixel wird durch 3 Byte beschrieben RGB bzw. im HexCode BGR.
- Die restlichen Bytes einer PixelLinie sind also 0.
Erzeuge mal ein einfaches Bitmap (zB 3x3 nur weiß) und schau's dir im Hex-Editor an. Die 3 PixelZeilen sehen dann zB wie folg aus:
FFFF FFFF FFFF FFFF FF00 0000
FFFF FFFF FFFF FFFF FF00 0000
FFFF FFFF FFFF FFFF FF00 0000
Mit dem oben beschriebenen dürfte einiges klar werden.
Gruß
Christian

Anzeige
AW: Bitmap mit Excel auslesen?
23.02.2008 20:00:56
pweksictul
Vielen Dank für die Tipps! Leider weiß ich nicht, wie ich das nach Excel importieren kann. Ich schätze mal, dass ich "zu Fuß" schneller bin. Trotzdem vielen Dank!

AW: Bitmap mit Excel auslesen?
24.02.2008 10:35:00
Herby
Hallo pweksictul,
anbei eine kleine Musterdatei, zum Auslesen der Bitmaps.
Ich hab mal die Info vom Christian umgesetzt.
https://www.herber.de/bbs/user/50150.xls
Vielleicht hilfts dir.
Viele Grüße
Herby

Anzeige
AW: Bitmap mit Excel auslesen?
24.02.2008 14:59:57
pweksictul
Super, das klappt schon mal. Ich musste nur Application.FileSearch ersetzen, da ich mit Excel 2007 arbeite. Jetzt kann ich schon mal Dateigröße und -Typ auslesen. Nun fehlen mir nur noch die Farbwerte (wie bereits geschrieben, muss ich nur wissen wo das erste nicht-weiße Pixel liegt, von links oben gesehen), aber das kriege ich hoffentlich recht bald hin. Hilfe wird aber immer noch gern angenommen ...

Anzeige
AW: Bitmap mit Excel auslesen?
24.02.2008 15:27:57
Christoph
Hallo nochmal,
ich saß gestern hier mit Christian zusammen am Rechner, als wir dir geantwortet haben. Daher mein Name im Kopf und seiner in Beitrag. Das nur als Info, falls du dich fragst, warum da zwei verschiedene Namen auftauchen.
Ich hab mal was zusammen bestöpselt - nur als Fragment. Damit kannst du die Bytes der Pixel in ein Array schreiben. Mit der Info von gestern, wie die einzelnen Pixellinien im ByteCode strukturiert sind, kannst du das Array jetzt analysieren und das erste nicht-weiße Pixel suchen.
Teste erst mal mit kleinen Bitmaps, zB 3x3 o.ä.

Option Explicit
Public Type BITMAP
bmHead As String * 18
bmWidth As Long
bmHeight As Long
End Type
Sub GetBitmapPixel()
Dim bmp As BITMAP
Dim intFile As Integer
Dim strTmp As String * 54
Dim lngBytes As Long
Dim bytPixel() As Byte
Const BMPFILE = "D:\3x3.bmp"
'Höhe und Breite des Bitmaps aus Header auslesen
intFile = FreeFile
Open BMPFILE For Binary Access Read As #intFile
Get #intFile, , bmp
Close #intFile
'Größe bestimmen
lngBytes = bmp.bmHeight * (bmp.bmWidth * 3 + bmp.bmWidth Mod 4)
ReDim bytPixel(0 To lngBytes - 1)
intFile = FreeFile
Open BMPFILE For Binary Access Read As #intFile
Get #intFile, , strTmp
Get #intFile, , bytPixel
Close #intFile
'Pixel sind jetzt im Array bytPixel.
End Sub

Gruß
Christoph
PS: Der Code läuft bei 24bit Bitmaps. Ob sich Header und Aufbau bei anderer Farbtiefe unterscheiden, musst du noch recherchieren.

Anzeige
AW: Bitmap mit Excel auslesen?
24.02.2008 16:20:31
pweksictul
Tausend Dank! Das funktioniert! Sehr elegant gelöst (das was ich verstanden habe) ...
Es funktioniert auch mit meinen Dateien und ich komme jetzt klar. Die Bitmaps habe ich mal just per batch alle mit 24 bit gespeichert. Nicht so elegant, aber pragmatisch. Bei einer Dateigröße von 768x1024 habe ich jetzt genau 3072 Bytes pro Zeile (mod 4 braucht's nicht) und kann dann recht einfach nach dem ersten nicht-weißen Pixel suchen, von unten, versteht sich.
Die Get-Anweisung bleibt für mich allerdings ein Buch mit sieben Siegeln. Ich sehe, dass es funktioniert, aber verstehe leider nicht warum ... Wie z.B. kommen Höhe und Breite der Datei in die entsprechenden Variablen im folgenden Code:

Sub BMPSize(D As String, Wdth As Long, Hght As Long)
Dim Nr As Integer
Dim Dmmy As String * 18
Nr = FreeFile
Open D$ For Binary As #Nr
Get #Nr, , Dmmy
Get #Nr, , Wdth
Get #Nr, , Hght
Close #Nr
End Sub


Wie gesagt, ich sehe, dass es funktioniert, aber ich kapier nicht wie. Aber Hauptsache ...
Und ganz fettes DANKE nochmal.

Anzeige
Bitmap Header
24.02.2008 17:28:00
Christoph
Wie z.B. kommen Höhe und Breite der Datei in die entsprechenden Variablen
Der Header des Bitmaps besteht aus dem FileHeader (14 Byte) und InfoHeader (40 Byte).
Im InfoHeader sind:
- Größe des InfoHeaders (4 Byte)
- Breite (4 Byte)
- Höhe (4 Byte)
....
Wenn ich jetzt die Höhe und Breite haben will schreibe ich die ersten 18 Byte in einen String mit der Länge 18. Der interessiert hier nicht weiter - deshalb kann man das so machen, ist aber nicht sauber.
Die nächsten 4 Byte (Breite) schreibe ich in die Long-Variable 'bmWidth'. Ebenso die Höhe in bmHeight.
Da Long-Variablen die Größe 4Byte haben passt das genau.
Type BITMAP
bmHead As String * 18
bmWidth As Long
bmHeight As Long
End Type
nach dem selben Prinzip wird das Array mit den Bytes der Pixel gefüllt.
Gruß
Christoph

Anzeige
AW: Bitmap Header
24.02.2008 18:15:00
pweksictul
Cool, jetzt hab ich's sogar kapiert. :-) Ich wusste nicht, dass bei mehreren get Anweisungen da weitergelesen wird, wo zuletzt aufgehört wurde. Pling ;-)
;
Anzeige
Anzeige

Infobox / Tutorial

Bitmap mit Excel auslesen


Schritt-für-Schritt-Anleitung

  1. Bitmap-Datei vorbereiten: Stelle sicher, dass du eine Bitmap-Datei hast, die du auslesen möchtest. Die empfohlenen Formate sind 24-Bit-Bitmaps, da der bereitgestellte VBA-Code für diese Art von Dateien gedacht ist.

  2. VBA-Editor öffnen: Gehe zu Excel und öffne den VBA-Editor mit ALT + F11.

  3. Modul einfügen: Klicke mit der rechten Maustaste auf „VBAProject (dein Workbook)“ und wähle „Modul einfügen“.

  4. Code einfügen: Kopiere den folgenden Code in das neue Modul:

    Option Explicit
    Public Type BITMAP
       bmHead As String * 18
       bmWidth As Long
       bmHeight As Long
    End Type
    
    Sub GetBitmapPixel()
       Dim bmp As BITMAP
       Dim intFile As Integer
       Dim strTmp As String * 54
       Dim lngBytes As Long
       Dim bytPixel() As Byte
       Const BMPFILE = "D:\DeinPfad\deineBitmap.bmp" ' Pfad zur Bitmap-Datei
    
       ' Höhe und Breite des Bitmaps aus Header auslesen
       intFile = FreeFile
       Open BMPFILE For Binary Access Read As #intFile
       Get #intFile, , bmp
       Close #intFile
    
       ' Größe bestimmen
       lngBytes = bmp.bmHeight * (bmp.bmWidth * 3 + bmp.bmWidth Mod 4)
       ReDim bytPixel(0 To lngBytes - 1)
       intFile = FreeFile
       Open BMPFILE For Binary Access Read As #intFile
       Get #intFile, , strTmp
       Get #intFile, , bytPixel
       Close #intFile
    
       ' Pixel sind jetzt im Array bytPixel.
    End Sub
  5. Code ausführen: Schließe den VBA-Editor und führe das Makro GetBitmapPixel aus, um die Pixelwerte zu laden.


Häufige Fehler und Lösungen

  • Fehler beim Öffnen der Datei: Stelle sicher, dass der Pfad zur Bitmap-Datei korrekt ist und die Datei existiert. Überprüfe auch, ob die Datei im richtigen Format vorliegt.

  • Variable nicht definiert: Wenn du eine Fehlermeldung über nicht definierte Variablen erhältst, stelle sicher, dass du die „Option Explicit“ am Anfang deines Codes hast, um Variablen korrekt zu deklarieren.

  • Falsche Bit-Tiefe: Der bereitgestellte Code funktioniert nur mit 24-Bit-Bitmaps. Stelle sicher, dass deine Bitmap diese Anforderungen erfüllt.


Alternative Methoden

  • Verwendung von Python: Wenn du nicht mit VBA arbeiten möchtest, kannst du auch Python und Bibliotheken wie PIL (Pillow) verwenden, um Bitmap-Dateien auszulesen und Pixelwerte zu bearbeiten.

  • Excel-Add-Ins: Es gibt verschiedene Excel-Add-Ins, die das Auslesen von Bitmap-Dateien erleichtern können, ohne dass du selbst Programmcode schreiben musst.


Praktische Beispiele

  1. Einfaches Bitmap erstellen: Erstelle eine 3x3 Bitmap mit weißen Pixeln und speichere sie als 3x3.bmp. Verwende den bereitgestellten VBA-Code, um die Pixelwerte auszulesen.

  2. Analyse der Pixelwerte: Nachdem du die Pixel in das Array bytPixel geladen hast, kannst du eine Schleife verwenden, um die Werte zu analysieren und das erste nicht-weiße Pixel zu finden.

Dim i As Long
For i = LBound(bytPixel) To UBound(bytPixel) Step 3
    If bytPixel(i) < 255 Then ' Annahme: Weiß ist 255
        MsgBox "Nicht-weißes Pixel gefunden bei Index: " & i
        Exit For
    End If
Next i

Tipps für Profis

  • Optimierung des Codes: Du kannst den Code optimieren, indem du Fehlerbehandlungen hinzufügst und sicherstellst, dass die Datei geöffnet und geschlossen wird, auch wenn ein Fehler auftritt.

  • Verwendung von Arrays: Arbeite mit Arrays, um die Leistung zu verbessern, insbesondere bei großen Bitmap-Dateien.

  • Erweiterung des Codes: Überlege, den Code zu erweitern, um zusätzliche Informationen wie Farbwerte in RGB oder Hexadezimalformat zu extrahieren.


FAQ: Häufige Fragen

1. Wie kann ich eine Bitmap-Datei in Excel öffnen?
Du kannst eine Bitmap-Datei in Excel öffnen, indem du den VBA-Code verwendest, der die Datei im Binärmodus öffnet und die benötigten Informationen aus dem Header extrahiert.

2. Was ist der Bitmap-Header?
Der Bitmap-Header enthält wichtige Informationen über die Bildgröße, die Farbtiefe und die Struktur der Pixel. Im Falle einer 24-Bit-Bitmap ist der Header 54 Byte groß.

3. Funktioniert dieser Code in Excel 2007?
Ja, der bereitgestellte VBA-Code funktioniert in Excel 2007, solange du die Application.FileSearch-Methode entsprechend anpasst, wie es in den Diskussionen erwähnt wurde.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige