Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
952to956
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
952to956
952to956
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

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 ...

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!

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

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 ;-)

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige