VB/Vba Bmp-Bilder schnell vergleichen

Hallo Wissende,

vor Tagen sah ich hier doch Code von Rainer wo die Bits/Bytes von bmp-Dateinen angesprochen, übereinandergelegt o.ä. wurden.
Im enstehenden Gesamt-Bmp sah man dann die Differenzen.

Zwischenzeitlich habe ich jetzt Code entwickelt, der aus allen 65536 Unicode-Zeichen z.B. von Arial bmp-Bildchen macht.

jetzt meine Frage, gibt es eine schnelle Methode um in Excel-Vba oder VB (ich habe VB5.0, aber teste auch gerne VB6.0 Code) um je zwei Bilder davon zu vergleichen ob sie gleich sind?

Zweck ist, zu ermitteln, welches Unicodezeichen druckbar ist.

D.h. In einer Schleife müßten alle 65536 Bilder mit dem Bild eines nichtdruckbaren Zeichens verglichen werden.

Hinweis, nachfolgende Bilder sind bmp, ich habe sie nur aus Hochladgründen umbennen müssen in xls. Bitte vor Benutzung wieder umbennen in bmp, danke.

Hier ist das Bild vom Zeichen 114
http://www.file-upload.net/download-3136641/bild114…

und hier das Bild von Zeichen 134, was nicht druckbar ist.
http://www.file-upload.net/download-3136642/bild134…

Mein Bildererzeugungscode benutzt das freie Grafiprogramm „IrfanView“ zur Umwandlung eines Zeichens in ein bmp.
Wenn andere Grafikformate wie jpg o,ä, besser geeignet wären, kann ich höchstwahrscheinlich auch diese „fabrizieren“.

Danke ^ Gruß
Reinhard

Hallo Reinhard,

Du kannst das Bild mit GetBitmapBits in ein ByteArray laden. Das weißt Du ja.

Wenn Du die Größe kennst, kannst Du für den nächsten Versuch vorher einen String anlegen, der die passende Länge hat und dann das ByteArray mit CopyMemory in den String schreiben.

Die beiden Strings lassen sich dann einfach mit = vergleichen.

Bedingung ist, daß die Grafiken pixelgenau an der selben Stelle liegen und immer exakt gleich groß sind.
Mit eingescannten Bildern funktioniert das deshalb nicht.

Im Code vergleiche ich nur, ob zwei Bytearrays gleich sind. (Ein Zeichen im String = 2 Bytes)
Die Bilder bekommst Du da selbst rein.

Gruß Rainer

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Sub Command1\_Click()
 Dim txt1 As String, txt2 As String
 txt1 = Space(10)
 txt2 = Space(10)
 Dim ByteArray(1 To 20)
 Dim i As Integer
 For i = 1 To 20
 ByteArray(i) = 0
 Next
 CopyMemory ByVal StrPtr(txt1), ByteArray(1), 20
 CopyMemory ByVal StrPtr(txt2), ByteArray(1), 20
 If txt1 = txt2 Then
 Me.Caption = "OK"
 Else
 Me.Caption = "Ne"
 End If
End Sub

Hallo Rainer,

Du kannst das Bild mit GetBitmapBits in ein ByteArray laden.
Das weißt Du ja.

wenn du wüßtest was ich alles nicht weiß :smile:
Aber macht nix, an dem Problem hänge ich schon Jahre, die Zeit das rauszufinden was du alles so meinst nehme ich mir gerne.
Ich fühle mich der Problemlösung schon so nahe wie noch nie.

Bedingung ist, daß die Grafiken pixelgenau an der selben
Stelle liegen und immer exakt gleich groß sind.
Mit eingescannten Bildern funktioniert das deshalb nicht.

Ich vertraue da auf die Abspeicherung durch Irfanview als bmp.
Laut Explorer sind alle bmp gleichgroß. M.E. müßten sie auch den gleichen „Header“ haben.
Unterschiede dann nur in unterschiedlichen Pixel- oder Punkt Bytes.
Und genau das will ich ja wissen.

Im Code vergleiche ich nur, ob zwei Bytearrays gleich sind.

„nur“, genau das suche ich :smile:

(Ein Zeichen im String = 2 Bytes)

Ich erinner mich, irgendwas mit Low- und HighByte, irgendwie auch noch falschrum, was aber hier egal wäre.

Die Bilder bekommst Du da selbst rein.

Schaun wir mal.

Ich kenne den „StrPtr“ von früher, also geht das nicht mit Vba, macht aber rein gar nix, erstelle ich halt mit VB5.0 eine txt-Datei wo untereinander steht:

Nummer Druckbar
114 ja
134 nein

Gruß
Reinhard

Hallo Reinhard,

Du kannst das Bild mit GetBitmapBits in ein ByteArray laden.
Das weißt Du ja.

wenn du wüßtest was ich alles nicht weiß :smile:

das steht doch unten bei ‚VB6 Zugriff auf BMP‘. Du hast geschrieben, daß Du das gesehen hast. :smile:

Ich vertraue da auf die Abspeicherung durch Irfanview als bmp.
Laut Explorer sind alle bmp gleichgroß. M.E. müßten sie auch
den gleichen „Header“ haben.

Den Header braucht nur die Datei. Das Bild musst Du in eine Pictuerbox laden.

Unterschiede dann nur in unterschiedlichen Pixel- oder Punkt
Bytes.
Und genau das will ich ja wissen.

Im Code vergleiche ich nur, ob zwei Bytearrays gleich sind.

„nur“, genau das suche ich :smile:

(Ein Zeichen im String = 2 Bytes)

Ich erinner mich, irgendwas mit Low- und HighByte, irgendwie
auch noch falschrum, was aber hier egal wäre.

Die Bilder bekommst Du da selbst rein.

Schaun wir mal.

Ich kenne den „StrPtr“ von früher, also geht das nicht mit
Vba, macht aber rein gar nix, erstelle ich halt mit VB5.0 eine
txt-Datei wo untereinander steht:

Nummer Druckbar
114 ja
134 nein

Und dann printest Du auf die Form oder in ein Picture zum Auswerten? Das klappt. Oder willst Du auf Papier drucken, einscannen … das wird so nichts. Da ist dann einiges mehr an Intelligenz in der Bilderkennung nötig.

Wenn was nicht ganz so klappt, wie Du wünschst, zeig’ den Code.
Was wir bisher haben, kann ich noch aus dem Kopf, da blicke ich durch und sehe Fehlerchen entsprechend schnell. Also nicht verrückt machen, lass’ mich einfach mitspielen. :smile:

Gruß Rainer

Hallo Rainer,

wenn du wüßtest was ich alles nicht weiß :smile:

das steht doch unten bei ‚VB6 Zugriff auf BMP‘. Du hast
geschrieben, daß Du das gesehen hast. :smile:

nein, ich schrieb daß ich Code von dir dazu hier gesehen habe. Unterhalb welches Betreffs, keine Ahnung.
Und ja, *schäm*, vor meiner Anfrage habe ich nicht gescrollt :frowning:

Ich vertraue da auf die Abspeicherung durch Irfanview als bmp.
Laut Explorer sind alle bmp gleichgroß. M.E. müßten sie auch
den gleichen „Header“ haben.

Den Header braucht nur die Datei. Das Bild musst Du in eine
Pictuerbox laden.

Liege ich da falsch wenn ich das anders sehe? Die PictureBox kriegt gesagt, stelle eine bmp dar. Dann wird wohl die PictureBox den Header auslesen um zu wissen wie sie das Bild anzeigen kann.
Bei jpg wohl ähnlich.

Und dann printest Du auf die Form oder in ein Picture zum
Auswerten?

Nein. Ich habe 65536 bmp-Dateien, die möchte ich alle mit einer bmp-Datei vergleichen ob sie den gleichen Inhalt haben oder nicht.
Ergebnis soll dann eine Txt-datei sein die so aussieht:

Nummer Druckbar
114 ja
134 nein

Wenn was nicht ganz so klappt, wie Du wünschst, zeig’ den
Code.

Welchen Code, ich hab doch noch gar keinen :smile:
Der Code für die Umwandlung eines Zeichens in eine bmp-Datei ist nachstehend.
Leicht in VB nachzubauen.

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Sub keybd\_event \_
 Lib "user32" ( \_
 ByVal byteVirtualKeycode As Byte, \_
 ByVal byteScan As Byte, \_
 ByVal lFlags As Long, \_
 ByVal lExtraInfo As Long)
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function EmptyClipboard Lib "user32" () As Long
Public Declare Function CloseClipboard Lib "user32" () As Long
Private Const KEYEVENTF\_KEYUP As Long = &H2 ' Taste lösen
Enum eVK\_Key
 VK\_LBUTTON = &H1 'Linker Mausbutton
 VK\_RBUTTON = &H2 'Rechter Mausbutton
 VK\_MBUTTON = &H4 'Mittlerer Masubutton
 VK\_BACK = &H8 'Backspace Taste
 VK\_TAB = &H9 'Tab Taste
 VK\_CLEAR = &HC 'Numpad 5 ohne Numlock
 VK\_RETURN = &HD 'Enter Taste
 VK\_SHIFT = &H10 'Shift Taste
 VK\_CONTROL = &H11 'STRG Taste
 VK\_MENU = &H12 'Alt Taste
 VK\_PAUSE = &H13 'Pause/Untbr
 VK\_CAPITAL = &H14 'Caps Lock/Feststelltaste
 VK\_ESCAPE = &H1B 'Escape
 VK\_SPACE = &H20 'Space/Leertaste
 VK\_PRIOR = &H21 'PageUp/Bild hoch
 VK\_NEXT = &H22 'PageDown/Bild runter
 VK\_END = &H23 'Ende
 VK\_HOME = &H24 'Home/Pos1
 VK\_LEFT = &H25 'Linke Pfeiltaste
 VK\_UP = &H26 'Obere Pfeilaste
 VK\_RIGHT = &H27 'Rechte Pfeiltaste
 VK\_DOWN = &H28 'Untee Pfeiltaste
 VK\_PRINT = &H2A 'Drucken (Nokia Tastaturen)
 VK\_SNAPSHOT = &H2C 'Drucken/S-Abf
 VK\_INSERT = &H2D 'Einfügen
 VK\_DELETE = &H2E 'Entfernen
 VK\_HELP = &H2F 'Hilfe
 VK\_0 = &H30 'Taste 0
 VK\_1 = &H31 'Taste 1
 VK\_2 = &H32 'Taste 2
 VK\_3 = &H33 'Taste 3
 VK\_4 = &H34 'Taste 4
 VK\_5 = &H35 'Taste 5
 VK\_6 = &H36 'Taste 6
 VK\_7 = &H37 'Taste 7
 VK\_8 = &H38 'Taste 8
 VK\_9 = &H39 'Taste 9
 VK\_A = &H41 'Taste A
 VK\_B = &H42 'Taste B
 VK\_C = &H43 'Taste C
 VK\_D = &H44 'Taste D
 VK\_E = &H45 'Taste E
 VK\_F = &H46 'Taste F
 VK\_G = &H47 'Taste G
 VK\_H = &H48 'Taste H
 VK\_I = &H49 'Taste I
 VK\_J = &H4A 'Taste J
 VK\_K = &H4B 'Taste K
 VK\_L = &H4C 'Taste L
 VK\_M = &H4D 'Taste M
 VK\_N = &H4E 'Taste N
 VK\_O = &H4F 'Taste O
 VK\_P = &H50 'Taste P
 VK\_Q = &H51 'Taste Q
 VK\_R = &H52 'Taste R
 VK\_S = &H53 'Taste S
 VK\_T = &H54 'Taste T
 VK\_U = &H55 'Taste U
 VK\_V = &H56 'Taste V
 VK\_W = &H57 'Taste W
 VK\_X = &H58 'Taste X
 VK\_Y = &H59 'Taste Y
 VK\_Z = &H5A 'Taste Z
 VK\_STARTKEY = &H5B 'Startmenütaste
 VK\_CONTEXTKEY = &H5D 'Kentextmenü
 VK\_NUMPAD0 = &H60 'Numpad Taste 0
 VK\_NUMPAD1 = &H61 'Numpad Taste 1
 VK\_NUMPAD2 = &H62 'Numpad Taste 2
 VK\_NUMPAD3 = &H63 'Numpad Taste 3
 VK\_NUMPAD4 = &H64 'Numpad Taste 4
 VK\_NUMPAD5 = &H65 'Numpad Taste 5
 VK\_NUMPAD6 = &H66 'Numpad Taste 6
 VK\_NUMPAD7 = &H67 'Numpad Taste 7
 VK\_NUMPAD8 = &H68 'Numpad Taste 8
 VK\_NUMPAD9 = &H69 'Numpad Taste 9
 VK\_MULTIPLY = &H6A 'Numpad Multiplikations Taste (\*)
 VK\_ADD = &H6B 'Numpad Additions Taste (+)
 VK\_SUBTRACT = &H6D 'Numpad Subtrations Taste (-)
 VK\_DECIMAL = &H6E 'Numpad Komma Taste (,)
 VK\_DIVIDE = &H6F 'Numpad Devidierungs Taste (/)
 VK\_F1 = &H70 'F1 Taste
 VK\_F2 = &H71 'F2 Taste
 VK\_F3 = &H72 'F3 Taste
 VK\_F4 = &H73 'F4 Taste
 VK\_F5 = &H74 'F5 Taste
 VK\_F6 = &H75 'F6 Taste
 VK\_F7 = &H76 'F7 Taste
 VK\_F8 = &H77 'F8 Taste
 VK\_F9 = &H78 'F9 Taste
 VK\_F10 = &H79 'F10 Taste
 VK\_F11 = &H7A 'F11 Taste
 VK\_F12 = &H7B 'F12 Taste
 VK\_F13 = &H7C 'F13 Taste
 VK\_F14 = &H7D 'F14 Taste
 VK\_F15 = &H7E 'F15 Taste
 VK\_F16 = &H7F 'F16 Taste
 VK\_F17 = &H80 'F17 Taste
 VK\_F18 = &H81 'F18 Taste
 VK\_F19 = &H82 'F19 Taste
 VK\_F20 = &H83 'F20 Taste
 VK\_F21 = &H84 'F21 Taste
 VK\_F22 = &H85 'F22 Taste
 VK\_F23 = &H86 'F23 Taste
 VK\_F24 = &H87 'F24 Taste
 VK\_NUMLOCK = &H90 'Numlock Taste
 VK\_OEM\_SCROLL = &H91 'Scroll Lock
 VK\_LSHIFT = &HA0 'Linke Shift-Taste
 VK\_RSHIFT = &HA1 'Rechte Shift-Taste
 VK\_LCONTROL = &HA2 'Linke STRG-Taste
 VK\_RCONTROL = &HA3 'Rechte STRG-Taste
 VK\_LMENU = &HA4 'Linke ALT-Taste
 VK\_RMENU = &HA5 'Rechte ALT-Taste
 VK\_OEM\_1 = &HBA '";"-Taste
 VK\_OEM\_PLUS = &HBB '"
 VK\_OEM\_COMMA = &HBC '","-Taste
 VK\_OEM\_MINUS = &HBD '"-"-Taste
 VK\_OEM\_PERIOD = &HBE '"."-taste
 VK\_OEM\_2 = &HBF '"/"-Taste
 VK\_OEM\_3 = &HC0 '"`"-Taste
 VK\_OEM\_4 = &HDB '"["-Taste
 VK\_OEM\_5 = &HDC '"\"-Taste
 VK\_OEM\_6 = &HDD '"]"-Taste
 VK\_OEM\_7 = &HDE '"
 VK\_ICO\_F17 = &HE0 'F17 einer Olivette Tastatur (Intern)
 VK\_ICO\_F18 = &HE1 'F18 einer Olivette Tastatur (Intern)
 VK\_OEM102 = &HE2 '"

Hallo Reinhard,

Liege ich da falsch wenn ich das anders sehe? Die PictureBox
kriegt gesagt, stelle eine bmp dar. Dann wird wohl die
PictureBox den Header auslesen um zu wissen wie sie das Bild
anzeigen kann.
Bei jpg wohl ähnlich.

Nein, nicht falsch. Im Header steht die Breite, Höhe, Farbauflösung …
Uns interessiert nur, daß die Bilder etwa gleich aussehen.

Und dann printest Du auf die Form oder in ein Picture zum
Auswerten?

Nein. Ich habe 65536 bmp-Dateien, die möchte ich alle mit
einer bmp-Datei vergleichen ob sie den gleichen Inhalt haben
oder nicht.
Ergebnis soll dann eine Txt-datei sein die so aussieht:

Nummer Druckbar
114 ja
134 nein

OK. Ich nehme mal an, die stehen alle im selben Verzeichnis.

Wenn was nicht ganz so klappt, wie Du wünschst, zeig’ den
Code.

Welchen Code, ich hab doch noch gar keinen :smile:
Der Code für die Umwandlung eines Zeichens in eine bmp-Datei
ist nachstehend.
Leicht in VB nachzubauen.

Muss ich ja nicht, Du hast die Dateien ja schon, der Teil muss also funktioniert haben.

Dann fangen wir eben mal an. :smile:

Erste Frage: Gibt es für nicht druckbare Zeichen verschiedenen Anzeigen und wenn ja wie viele?

Du brauchst eine Picturebox für die Zeichen, die geprüft werden sollen und für jede Darstellung von nicht druckbaren Zeichen eine weitere. Wenn das mehrere sind, würde ich dafür ein Steuerelementefeld nehmen.

Dann brauchst Du noch einen Button zum starten und aus Bequemlichkeit eine Filelistbox, die Du auf den Pfad zu Deinen Bildern stellst.

Wieviele PicBoxen sind’s?

Gruß Rainer

Hallo Rainer,

Nein, nicht falsch. Im Header steht die Breite, Höhe,
Farbauflösung …
Uns interessiert nur, daß die Bilder etwa gleich aussehen.

ja, sind sie gleich oder nicht.

Nein. Ich habe 65536 bmp-Dateien, die möchte ich alle mit

OK. Ich nehme mal an, die stehen alle im selben Verzeichnis.

Ja.

Erste Frage: Gibt es für nicht druckbare Zeichen verschiedenen
Anzeigen und wenn ja wie viele?

? Kennst du das nicht? So wie ich das kenne nur eine Anzeige, ein Quadrat.

Ist das in Vb anders?
Schreib mal bitte in Vb in eine TextBox o.ä. mit einer Schleife bei Schriftart Arial die Zeichen 114 bis 134 über Chr W (Nummer) rein.
Wird da kein Quadrat angezeigt bei nicht druckbaren Zeichen?

Wieviele PicBoxen sind’s?

Wenn ich das richtig verstanden habe, werden es wohl nur zwei sein.

Gruß
Reinhard

Guten Morgen Reinhard,

Erste Frage: Gibt es für nicht druckbare Zeichen verschiedenen
Anzeigen und wenn ja wie viele?

? Kennst du das nicht? So wie ich das kenne nur eine Anzeige,
ein Quadrat.

Ich kenne zwei. :smile: Ein Quadrat und ein zu breit geratenes |

Ist das in Vb anders?
Schreib mal bitte in Vb in eine TextBox o.ä. mit einer
Schleife bei Schriftart Arial die Zeichen 114 bis 134 über
Chr W (Nummer) rein.
Wird da kein Quadrat angezeigt bei nicht druckbaren Zeichen?

Das wird ein Quadrat. Jetzt bist Du mit Chr(13) und der Textbox dran. :smile:

Wieviele PicBoxen sind’s?

Wenn ich das richtig verstanden habe, werden es wohl nur zwei
sein.

Dann sieh Dir den Code mal an …
Ungetestet, grundsätzlich soll der aber richtig sein.
Deine Bilder fangen ja wohl mit Chr(0) an. Falls nicht musst Du die Ausgabe in die Protokolldatei anpassen.

Gruß Rainer

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen 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

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Dim PicBits1() As Byte, PicInfo As BITMAP
Dim PicBits2() As Byte
Dim Txt1 As String, Txt2 As String
Dim Cnt As Long, BytesPerLine As Long

Private Sub Command1\_Click()
 Dim i As Integer
 Dim Pfd As String, Na As String
 Dim ff As Integer

 GetObject Picture1.Image, Len(PicInfo), PicInfo
 BytesPerLine = (PicInfo.bmWidth \* 3 + 3) And &HFFFFFFFC
 ReDim PicBits1(1 To BytesPerLine \* PicInfo.bmHeight \* 3) As Byte
 GetBitmapBits Picture1.Image, UBound(PicBits1), PicBits1(1)

 Txt1 = Space((UBound(PicBits1) + 1) \ 2)
 CopyMemory ByVal StrPtr(Txt1), PicBits1(1), UBound(PicBits1)

 Pfd = File1.Path
 If Right(Pfd, 1) "\" Then
 Pfd = Pfd & "\"
 End If

 ff = FreeFile
 Open Pfd & "Protokoll.txt" For Output As #ff

 For i = 0 To File1.ListCount - 1

 Na = Pfd & File1.List(i)

 Picture2.Picture = LoadPicture(Na)

 GetObject Picture2.Image, Len(PicInfo), PicInfo
 BytesPerLine = (PicInfo.bmWidth \* 3 + 3) And &HFFFFFFFC
 ReDim PicBits2(1 To BytesPerLine \* PicInfo.bmHeight \* 3) As Byte
 GetBitmapBits Picture2.Image, UBound(PicBits2), PicBits2(1)

 Txt2 = Space((UBound(PicBits2) + 1) \ 2)
 CopyMemory ByVal StrPtr(Txt2), PicBits2(1), UBound(PicBits2)

 If Txt1 = Txt2 Then
 Print #ff, CStr(i) & " Ja" & vbCrLf
 Else
 Print #ff, CStr(i) & " Nein" & vbCrLf
 End If

 Next

 Close #ff
End Sub

Hallo Rainer,

? Kennst du das nicht? So wie ich das kenne nur eine Anzeige,
ein Quadrat.

Ich kenne zwei. :smile: Ein Quadrat und ein zu breit geratenes |

ich wußt schon lange daß du doppelt soviel weißt wie ich :smile:)

Dann sieh Dir den Code mal an …
Ungetestet, grundsätzlich soll der aber richtig sein.
Deine Bilder fangen ja wohl mit Chr(0) an. Falls nicht musst
Du die Ausgabe in die Protokolldatei anpassen.

Sie fangen alle mit 42 4D … an, also BM…

Wie soll ich da was anpassen?

Nach deiner sehr großen Hilfe nachstehend mein Code daraus.
Leider wird immer Nein angezeigt bzw. Ungleich=wahr.

Auf dem Bild sieht man aber, daß sie zwar ähnlich sind aber nicht gleich, oder mischt da Notepad mit?

http://www.image-load.net/page.php?type=jpg&f=2865a6…

Was ist eigentlich File1 für ein Steuerelement gewesen?

Danke ^ Gruß
Reinhard

Option Explicit
'Option Compare Text 'bringt auch nix

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen 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

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Dim PicBits1() As Byte, PicInfo As BITMAP
Dim PicBits2() As Byte
Dim Txt1 As String, Txt2 As String
Dim Cnt As Long, BytesPerLine As Long

Private Sub Form\_Load()
Picture1.Picture = LoadPicture("c:\test\zeichenbilder\bild131.bmp")
End Sub

Private Sub Command1\_Click()
Dim B As Long, Na As String, ff As Integer, NP
Dim Z, Ungleich As Boolean
Const Pfd As String = "C:\test\zeichenbilder\"
GetObject Picture1.Image, Len(PicInfo), PicInfo
BytesPerLine = (PicInfo.bmWidth \* 3 + 3) And &HFFFFFFFC
ReDim PicBits1(1 To BytesPerLine \* PicInfo.bmHeight \* 3) As Byte
GetBitmapBits Picture1.Image, UBound(PicBits1), PicBits1(1)
Txt1 = Space((UBound(PicBits1) + 1) \ 2)
CopyMemory ByVal StrPtr(Txt1), PicBits1(1), UBound(PicBits1)
ff = FreeFile
Open Pfd & "Protokoll.txt" For Output As #ff
 For B = 34 To 131
 Na = Pfd & "Bild" & B & ".bmp"
 Picture2.Picture = LoadPicture(Na)
 GetObject Picture2.Image, Len(PicInfo), PicInfo
 BytesPerLine = (PicInfo.bmWidth \* 3 + 3) And &HFFFFFFFC
 ReDim PicBits2(1 To BytesPerLine \* PicInfo.bmHeight \* 3) As Byte
 GetBitmapBits Picture2.Image, UBound(PicBits2), PicBits2(1)
 Txt2 = Space((UBound(PicBits2) + 1) \ 2)
 CopyMemory ByVal StrPtr(Txt2), PicBits2(1), UBound(PicBits2)
 Ungleich = False
 For Z = 1 To Len(Txt1)
 If Mid(Txt1, Z, 1) Mid(Txt2, Z, 1) Then
 Ungleich = True
 Exit For
 End If
 Next Z
 If Txt1 = Txt2 Then
 Print #ff, Format(B, "00000") & " Ja" & " " & Ungleich
 Else
 Print #ff, Format(B, "00000") & " Nein" & " " & Ungleich
 End If
 Print #ff, Txt2 & vbCr
 Picture2.Picture = LoadPicture()
 Next B
Close #ff
NP = Shell("notepad " & Pfd & "Protokoll.txt", vbMaximizedFocus)
End Sub

Sie fangen alle mit 42 4D … an, also BM…

Wie soll ich da was anpassen?

So, wie Du’s getan hast. Alles OK. :smile:

Nach deiner sehr großen Hilfe nachstehend mein Code daraus.
Leider wird immer Nein angezeigt bzw. Ungleich=wahr.

hmmm. Da habe ich die Ursache noch nicht entdeckt.
Ich suche gleich weiter …

Auf dem Bild sieht man aber, daß sie zwar ähnlich sind aber
nicht gleich, oder mischt da Notepad mit?

Notepad? Bei Deinem Programm, die Bilder abzuspeichern eventuell.
Hier garantiert nicht.

http://www.image-load.net/page.php?type=jpg&f=2865a6…

Was ist eigentlich File1 für ein Steuerelement gewesen?

*gg* die Filelistbox zeigt Dir alle Dateien in dem Pfad, der in der Eigenschaft .Path steht. Die Findest Du ganz oben in der Werkzeugsammlung zusammen mit Drive und Dir.

Du hast einen andere Schleife gebaut, die Dir alle Bilder nacheinander von der Platte holt, ist auch OK. Es gibt meist viele Wege zum Ziel. :smile:

Nun kurz zum Code:

Ungleich = False
For Z = 1 To Len(Txt1)
If Mid(Txt1, Z, 1) Mid(Txt2, Z, 1) Then
Ungleich = True
Exit For
End If
Next Z

Wenn Du in der Schleife Zeichen für Zeichen vergleichst, können wir uns das Umschaufeln in die Strings auch sparen, das geht im Bytearray auch. Das dauert nur sehr lang, deshalb der Umweg über die Strings, weil man die ohne Schleife vergleichen kann. Das geht deutlich schneller.

Wenn Du folgendes hast:

a = „Test“
b = „Test“
c = „Rest“

und willst die vergleichen, vergleichst Du dann auch Zeichen für Zeichen?

If a = b …
wird Dir auch ohne Schleife ein True liefern und …
If a = c …
wird Dir ein False liefern. Warum Du da eine Schleife gebaut hast, ist mir unklar.

Und jetzt lade ich mir mal Deine beiden Bilder und teste …

Gruß Rainer

Hallo Reinhard,

ich habe auf meiner festplatte jetzt ein Verzechnis: ‚C:\Reinhard‘ und darin Deine beiden Bilder: Bild114.bmp und Bild134.bmp

Bild114 lade ich in Picture1 und das wird auch als erstes in Picture2 geladen.

Die Bilder der beiden Pictureboxen müssen dann zwangsläufig gleich sein, es wird ja die selbe Vorlage geladen.

Dann läuft mein Programm und stellt fest, daß Bild114 = Bild114 ist aber ungleich Bild134. … Funktioniert, ist jetzt getestet.

Wenn bei Dir für zwei Zeichen mit Rechtecken keine Gleichheit festgestellt wird, sind die Bilder nicht pixelgenau gleich. Dann funktioniert das Verfahren so nicht.

Gib doch mal noch zwei - drei andere Bilder von nicht druckbaren Zeichen. Dann kann ich hier sehen, ob die erkannt werden.

Gruß Rainer

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen 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

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Dim PicBits1() As Byte, PicInfo As BITMAP
Dim PicBits2() As Byte
Dim Txt1 As String, Txt2 As String, Pfd As String
Dim Cnt As Long, BytesPerLine As Long

Private Sub Command1\_Click()
 Dim i As Integer
 Dim Na As String
 Dim ff As Integer

 GetObject Picture1.Image, Len(PicInfo), PicInfo
 BytesPerLine = (PicInfo.bmWidth \* 3 + 3) And &HFFFFFFFC
 ReDim PicBits1(1 To BytesPerLine \* PicInfo.bmHeight \* 3) As Byte
 GetBitmapBits Picture1.Image, UBound(PicBits1), PicBits1(1)

 Txt1 = Space((UBound(PicBits1) + 1) \ 2)
 CopyMemory ByVal StrPtr(Txt1), PicBits1(1), UBound(PicBits1)

 For i = 0 To File1.ListCount - 1

 Na = Pfd & File1.List(i)

 Picture2.Picture = LoadPicture(Na)

 GetObject Picture2.Image, Len(PicInfo), PicInfo
 BytesPerLine = (PicInfo.bmWidth \* 3 + 3) And &HFFFFFFFC
 ReDim PicBits2(1 To BytesPerLine \* PicInfo.bmHeight \* 3) As Byte
 GetBitmapBits Picture2.Image, UBound(PicBits2), PicBits2(1)

 Txt2 = Space((UBound(PicBits2) + 1) \ 2)
 CopyMemory ByVal StrPtr(Txt2), PicBits2(1), UBound(PicBits2)

 If Txt1 = Txt2 Then
 List1.AddItem CStr(i) & " Ja"
 Else
 List1.AddItem CStr(i) & " Nein"
 End If

 Next

End Sub

Private Sub Form\_Load()
 Picture1.AutoSize = True
 Picture1.AutoSize = True
 Picture1.Picture = LoadPicture("C:\Reinhard\Bild114.bmp")
 Pfd = "C:\Reinhard\"
 File1.Path = Pfd
 File1.Refresh
End Sub

Hallo Rainer,

http://www.image-load.net/page.php?type=jpg&f=2865a6…

Was ist eigentlich File1 für ein Steuerelement gewesen?

*gg* die Filelistbox zeigt Dir alle Dateien in dem Pfad, der
in der Eigenschaft .Path steht. Die Findest Du ganz oben in
der Werkzeugsammlung zusammen mit Drive und Dir.

aha, danke. Ich habe aber auch noch andere Dateien in dem Ordner, da ist die Einleseschleife schon gut.

Warum Du da eine Schleife gebaut
hast, ist mir unklar.

Die kam ja erst als ich ratlos, hilflos sah daß überall „Nein“ stand, da traue ich nix mehr in VB, irgendwie dachte ich, da werden nur die ersten 255 yte verglichen oder so, deshalb auch oben Option Compare Text.

Alles nur plumpe Versuche den Fehlergrund zu finden, einzugrenzen bzw. nur eindeutig geklärte Dinge als Feherlgrund auszuschließen…

Gruß
Reinhard

Hallo Reinhard,

Ich habe aber auch noch andere Dateien in dem
Ordner, da ist die Einleseschleife schon gut.

Ja, OK. Für mich war’s zum Testen so einfacher.

Die kam ja erst als ich ratlos, hilflos sah daß überall „Nein“
stand, da traue ich nix mehr in VB, irgendwie dachte ich, da
werden nur die ersten 255 yte verglichen oder so, deshalb auch
oben Option Compare Text.

OK.

Alles nur plumpe Versuche den Fehlergrund zu finden,
einzugrenzen bzw. nur eindeutig geklärte Dinge als Feherlgrund
auszuschließen…

Dei letzte Version ist fast unverändert, die ist getestet.

Gruß Rainer

Hallo Rainer,

Bild114 lade ich in Picture1 und das wird auch als erstes in
Picture2 geladen.

Die Bilder der beiden Pictureboxen müssen dann zwangsläufig
gleich sein, es wird ja die selbe Vorlage geladen.

theoretisch müssen, mein Code sagt klar, wenn er zwei identische Bilder vergleicht, sie wären nicht gleich :frowning:((
Ich habe im nachstehenden Code auch bild114 mit bild114 verglichen, Ergebnis= ungleich.

Dann läuft mein Programm und stellt fest, daß Bild114 =
Bild114 ist aber ungleich Bild134. … Funktioniert, ist jetzt
getestet.

Wenn bei Dir für zwei Zeichen mit Rechtecken keine Gleichheit
festgestellt wird, sind die Bilder nicht pixelgenau gleich.
Dann funktioniert das Verfahren so nicht.

Das wäre eine Hiobsbotschaft für mich:frowning: Dann wäre das ganze Vorhaben ja wieder mal am Ende.

Noch hoffe ich darauf, daß ich bei der Umsetzung deines Codes einen Fehler machte. Kann ja wohl nicht sein daß Picture1 und Picture2 das gleiche Bild (im Code bild114.bmp) reingeladen bekommen und mein Code sagt die wären ungleich.

Gib doch mal noch zwei - drei andere Bilder von nicht
druckbaren Zeichen. Dann kann ich hier sehen, ob die erkannt
werden.

Das bringt m.E. jetzt noch nix. Denn mein Code spinnt ja schon rum wenn er bild114 mit bild114 vergleicht.
Außerdem mag ich keine schlechten Nacjrichten :smile: Wenn du mir dann sagst, diese Mistquadrate werden auch noch unterschiedlich in Bytes abgebildet wäre das auch niederschmetternd.

So, ich befreie mal jetzt den Ordner von allem was kein bmp ist und teste mal komplett deinen Code.
Irgendwie MUß ich doch rauskriegen können warum dein Code klappt und meiner nicht.
(Oder du *lächel*)

Gruß
Reinhard

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen 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
Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Dim PicBits1() As Byte, PicInfo As BITMAP
Dim PicBits2() As Byte
Dim Txt1 As String, Txt2 As String
Dim Cnt As Long, BytesPerLine As Long

Private Sub Form\_Load()
Picture1.Picture = LoadPicture("c:\test\zeichenbilder\bild **114**.bmp")
End Sub

Private Sub Command1\_Click()
Dim B As Long, Na As String, ff As Integer, NP
Dim Z, Ungleich As Boolean
Const Pfd As String = "C:\test\zeichenbilder\"
GetObject Picture1.Image, Len(PicInfo), PicInfo
BytesPerLine = (PicInfo.bmWidth \* 3 + 3) And &HFFFFFFFC
ReDim PicBits1(1 To BytesPerLine \* PicInfo.bmHeight \* 3) As Byte
GetBitmapBits Picture1.Image, UBound(PicBits1), PicBits1(1)
Txt1 = Space((UBound(PicBits1) + 1) \ 2)
CopyMemory ByVal StrPtr(Txt1), PicBits1(1), UBound(PicBits1)
ff = FreeFile
Open Pfd & "Protokoll.txt" For Output As #ff
 For B = **114 To 114** 
 Na = Pfd & "Bild" & B & ".bmp"
 Picture2.Picture = LoadPicture(Na)
 GetObject Picture2.Image, Len(PicInfo), PicInfo
 BytesPerLine = (PicInfo.bmWidth \* 3 + 3) And &HFFFFFFFC
 ReDim PicBits2(1 To BytesPerLine \* PicInfo.bmHeight \* 3) As Byte
 GetBitmapBits Picture2.Image, UBound(PicBits2), PicBits2(1)
 Txt2 = Space((UBound(PicBits2) + 1) \ 2)
 CopyMemory ByVal StrPtr(Txt2), PicBits2(1), UBound(PicBits2)
 If Txt1 = Txt2 Then
 Print #ff, Format(B, "00000") & " Ja" & " "
 Else
 Print #ff, Format(B, "00000") & " Nein" & " "
 End If
 Print #ff, Txt2 & vbCr
 Picture2.Picture = LoadPicture()
 Next B
Close #ff
NP = Shell("notepad " & Pfd & "Protokoll.txt", vbMaximizedFocus)
End Sub

Hallo Reinhard,

theoretisch müssen, mein Code sagt klar, wenn er zwei
identische Bilder vergleicht, sie wären nicht gleich :frowning:((
Ich habe im nachstehenden Code auch bild114 mit bild114
verglichen, Ergebnis= ungleich.

dann hast Du an einer entscheidenden Stelle etwas verändert.
Nimm mal meinen getesteten code und ändere nur die Schleife mit den Pfaden. Das ist getestet, muss gehen.

Dann läuft mein Programm und stellt fest, daß Bild114 =
Bild114 ist aber ungleich Bild134. … Funktioniert, ist jetzt
getestet.

Wenn bei Dir für zwei Zeichen mit Rechtecken keine Gleichheit
festgestellt wird, sind die Bilder nicht pixelgenau gleich.
Dann funktioniert das Verfahren so nicht.

Das wäre eine Hiobsbotschaft für mich:frowning: Dann wäre das ganze
Vorhaben ja wieder mal am Ende.

Bei Dir kommt ja, Bild 114 ist ungleich Bild 114. Das liegt dann am Code. Bei mir funktioniert es ja bis dahin.

Noch hoffe ich darauf, daß ich bei der Umsetzung deines Codes
einen Fehler machte. Kann ja wohl nicht sein daß Picture1 und
Picture2 das gleiche Bild (im Code bild114.bmp) reingeladen
bekommen und mein Code sagt die wären ungleich.

Genau. Da musst Du etwas verändert haben.

Gib doch mal noch zwei - drei andere Bilder von nicht
druckbaren Zeichen. Dann kann ich hier sehen, ob die erkannt
werden.

Das bringt m.E. jetzt noch nix. Denn mein Code spinnt ja schon
rum wenn er bild114 mit bild114 vergleicht.
Außerdem mag ich keine schlechten Nacjrichten :smile: Wenn du mir
dann sagst, diese Mistquadrate werden auch noch
unterschiedlich in Bytes abgebildet wäre das auch
niederschmetternd.

So, ich befreie mal jetzt den Ordner von allem was kein bmp
ist und teste mal komplett deinen Code.
Irgendwie MUß ich doch rauskriegen können warum dein Code
klappt und meiner nicht.
(Oder du *lächel*)

Ja, das finden wir schon. :smile:

Gruß Rainer

Hallo reinhard,

hast Du bei den PicBoxen Autosize auf true?
Wenn’s nicht im Code steht, kann ich das von hier aus nicht sehen.

Wenn Du das bei einer PicBox vergessen hast, wäre das die Ursache.
Im Code sehe ich so erst mal nichts. :frowning:

Gruß Rainer

Hallo Rainer,

hast Du bei den PicBoxen Autosize auf true?
Wenn’s nicht im Code steht, kann ich das von hier aus nicht
sehen.

Klasse, auf einmal sind Bild114 und Bild114 gleich :smile:

Wenn Du das bei einer PicBox vergessen hast, wäre das die
Ursache.

Mir völlig unklar warum, txt1 ist doch nicht der sichtbare Text wenn das Bild größer als die Picturebox ist.
Oder doch?

Gruß
Reinhard

Hallo Reinhard,

Mir völlig unklar warum, txt1 ist doch nicht der sichtbare
Text wenn das Bild größer als die Picturebox ist.
Oder doch?

Txt1 ist gar kein Text, sondern der gesamte Inhalt, alle Pixel in Picture1. Wenn da nicht Autosize auf True steht. ist da um das Bild noch ein grauer Rand. Oder wenn Picture1 zu klein ist, hat es weniger Pixel als Bild114.bmp

Die Pixel sind RGB … ‚&hffffff‘ für einen weißen Pixel.
Zwei Pixel sind dann … ‚ff ff ff ff ff ff‘ Daraus machen wir beim Umschaufeln drei Zeichen ChrW("&hffff") :smile:
Nichts lesbares, aber das ist egal, auf Gleichheit testen geht trotzdem :smile:
2 X 24 = 48
3 X 16 = 48
Uns interessieren nur die Bits. Wie die zu Bytes zusammengefasst sind ist unwichtig. Text steht in den Variablen Txt1 und Txt2 jedenfalls nicht.

Gruß Rainer

Mir völlig unklar warum, txt1 ist doch nicht der sichtbare
Text wenn das Bild größer als die Picturebox ist.
Oder doch?

Hallo Rainer,

Txt1 ist gar kein Text, sondern der gesamte Inhalt, alle Pixel
in Picture1.

entschuldige, falsche Wortwahl von mir.

Wenn da nicht Autosize auf True steht. ist da um
das Bild noch ein grauer Rand. Oder wenn Picture1 zu klein
ist, hat es weniger Pixel als Bild114.bmp

Ach, der graue Rand wird mitberechnet? Dann ist es mir klar.
Ich hab die Boxen frei Hand eingefügt, also nicht eine und die dann kopiert. Die waren schon größer als das Bild aber unterschiedlich groß.

Ich bin jedenfalls glücklich daß ich durch deine Hilfe das Problem endlich lösen konnte.
Es gab eben noch einen unbedeutenden Rückschritt betreffs der Laufzeit meines Umwandlungscodes eines zeichen in eine bmp.

Im Code ist sehr notwendig eine Sleep-Pause eingebaut.
Ich hatte die Pause runterminimiert. Bei Tests klappte auch alles. Jetzt bei genauerer Prüfung stellte sich heraus, Sleep 300 ist zu wenig, Irfanview braucht wohl Sleep 1000.

Aber egal, dann läuft der Code halt über Nacht nicht 5-7 Stunden sondern 12 o.ä.

Ich brauch das ja nur einmal zu machen.
Aus den Ergebnissen kann ich mir dann ja das basteln warum ich eigentlich mit dem Projekt begann.

Wenn ich mir mit chrw(…) alle Zeichen in Arial in Unicode auflisten lasse, wimmelt es von diesen Quadraten.
Als Ergebnis von allem möchte ich eine Form haben, wo je nach Bildschirm so 50 Zeichen pro Zeile stehen und durch Scrollen sieht man alle anderen druckbaren Zeichen.

Diesem Ziel bin ich durch dich sehr nahe.

Und ja, ich opfere Energie für Dinge die die Welt nicht braucht :smile:
Ich muß auch sagen, mit ein innerer Ansporn war, daß ich hier und andernorts anfragte wie man denn druckbare zeichen von nichtdruckbaren Zeichen unterscheiden könnte.
Da kam nix.

Und da ich mir dachte, kann doch gar nicht sein, Programme erkennen ob sie ein Zeichen drucken können, wenn nicht drucken sie ein Quadrat, das muß doch rauszukriegen sein.

Insofern fühle ich mich grad sehr stolz :smile:

Und danke daß du mir einen eigenen Ordner angelegt hast, laß den mal so stehen, ich hab noch viele Projekte im Hinterkopf… *gg*

Gruß
Reinhard

Hallo Reinhard,

Ach, der graue Rand wird mitberechnet? Dann ist es mir klar.
Ich hab die Boxen frei Hand eingefügt, also nicht eine und die
dann kopiert. Die waren schon größer als das Bild aber
unterschiedlich groß.

und damit waren die Strings, die Du miteinander verglichen hast unterschiedlich lang. :smile:

Ich bin jedenfalls glücklich daß ich durch deine Hilfe das
Problem endlich lösen konnte.
Es gab eben noch einen unbedeutenden Rückschritt betreffs der
Laufzeit meines Umwandlungscodes eines zeichen in eine bmp.

Im Code ist sehr notwendig eine Sleep-Pause eingebaut.
Ich hatte die Pause runterminimiert. Bei Tests klappte auch
alles. Jetzt bei genauerer Prüfung stellte sich heraus, Sleep
300 ist zu wenig, Irfanview braucht wohl Sleep 1000.

Aber egal, dann läuft der Code halt über Nacht nicht 5-7
Stunden sondern 12 o.ä.

Bei so etwas bin ich auch großzügig. :smile: Du erinnerst Dich ja noch an mein Projekt kürzlich, das über drei Wochen gelaufen ist.

Ich brauch das ja nur einmal zu machen.
Aus den Ergebnissen kann ich mir dann ja das basteln warum ich
eigentlich mit dem Projekt begann.

Wenn ich mir mit chrw(…) alle Zeichen in Arial in Unicode
auflisten lasse, wimmelt es von diesen Quadraten.
Als Ergebnis von allem möchte ich eine Form haben, wo je nach
Bildschirm so 50 Zeichen pro Zeile stehen und durch Scrollen
sieht man alle anderen druckbaren Zeichen.

Diesem Ziel bin ich durch dich sehr nahe.

Und ja, ich opfere Energie für Dinge die die Welt nicht
braucht :smile:

Eher als das, was ich da neulich gemacht habe.
Da habe ich nur mir selbst bewiesen, daß es richtig ist, nicht Lotto zu spielen. :smile:

Ich muß auch sagen, mit ein innerer Ansporn war, daß ich hier
und andernorts anfragte wie man denn druckbare zeichen von
nichtdruckbaren Zeichen unterscheiden könnte.
Da kam nix.

Und da ich mir dachte, kann doch gar nicht sein, Programme
erkennen ob sie ein Zeichen drucken können, wenn nicht drucken
sie ein Quadrat, das muß doch rauszukriegen sein.

Insofern fühle ich mich grad sehr stolz :smile:

Die Bilder so recht schnell zu vergleichen gefällt mir auch.
Das verwende ich u.U. auch irgendwann.

Und danke daß du mir einen eigenen Ordner angelegt hast, laß
den mal so stehen, ich hab noch viele Projekte im
Hinterkopf… *gg*

Ist OK, das Verzeichnis bleibt stehen. :smile:
Dann weiß ich, was da abgelegt ist. Für Projekte ist da viel Platz!

Was wir hier gemeinsam entwickelt haben, habe ich bisher fast alles irgendwann gebraucht und hatte dann schon Vorlauf, konnte auf vorhandenen Code, den ich auch verstehe zurückgreifen. Das hier war mir in den Grundsätzen klar, aber getippt war’s hat noch nie.
Nun weiß ich, daß ich mir das richtig ausgedacht habe, ist getestet und läuft. Da lauern keine Überraschungen mehr.

Hast Du nun auch schon mal zwei unterschiedliche, nicht druckbare Zeichen identifizieren können?

Sag Bescheid, wenn Deine Liste fertig ist.

Gruß Rainer