VB/Vba Bmp-Bilder schnell vergleichen

Hallo Reinhard,

mir ist noch eingefallen, daß ich Dich am Anfang mal gefragt habe, ob Du direkt in die Picturebox printest.

Ich habe jetzt drei exakt gleich große Pictureboxen auf der Form und habe das mit dem Printen in die Picturebox mal ausprobiert.

Ist das die Liste, die Du gesucht hast?

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 PicBits3() As Byte
Dim Txt1 As String, Txt2 As String, Txt3 As String, Pfd As String
Dim Cnt As Long, BytesPerLine As Long

Private Sub Command1\_Click()
 Dim i As Long
 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)

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

 Txt3 = Space((UBound(PicBits3) + 1) \ 2)
 CopyMemory ByVal StrPtr(Txt3), PicBits3(1), UBound(PicBits3)

 For i = 0 To 65535

 Picture2.Cls
 Picture2.CurrentX = 30
 Picture2.CurrentY = 30
 Picture2.Print ChrW(i)

 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 Or Txt3 = Txt2 Then

 Else
 List1.AddItem CStr(i) & " " & ChrW(i)
 End If

 Next

End Sub

Private Sub Form\_Load()
 Me.Show
 Picture1.Cls
 Picture1.CurrentX = 30
 Picture1.CurrentY = 30
 Picture1.Print ChrW(134)
 Picture3.Cls
 Picture3.CurrentX = 30
 Picture3.CurrentY = 30
 Picture3.Print ChrW(1)
End Sub

Hallo Rainer,

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:

okay, muß man erstmal wissen. Ohne diese kenntnis hätt/habe ich gedacht, ist die Picturebox zu klein, na und wird nur ein Teil des Bildes angezeigt, wenn zu groß halt das Bild mit Rand.

Nach meiner Deutung, wenn ich dann den Picturebox-Inhalt auslese wäre der frei von Rand oder es fehlen auch keine „Teile“ des Bildes die nicht angezeigt werden

Aber okay, du hast mir gesagt wie VB das sieht.

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.

Ja, natürlich vergessen was du da gemacht hast, aber da lief was lange.

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:

Eben, der Weg ist das Ziel, man lernt dabei. Bei allen meinen Ansätzen zu dem Projekt habe ich gelernt, z.B. wie man die ttf oder wie die heißt von Arialunicode auszulesen um da eine Lösung zu finden u.v.m.
Spielt so gesehen gar keine Rolle daß es nicht von Erfolg gekrönt war.

Und zu Lotto, laß uns mal in einer Spielbank treffen, da sind die Gewinnchancen höher. Das ist das eine, das andere ist, da kann man vorzüglich essen, sehr zivile Preise trotz noblem Restaurant, ist klar, die Zocker zahlen das mit.

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

Ja, geht fix, nix mit Stunden.

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

Danke.

Nun weiß ich, daß ich mir das richtig ausgedacht habe, ist
getestet und läuft. Da lauern keine Überraschungen mehr.

Nichts geht über einen Test, erst dann bin ich beruhigt.
Am besten Tests auf verschiedenen Betriebssystemen.
Vom Mitlesen her weiß ich das z.B. SenKeys, was sowieso unsicher ist, erschwerdenerweise je nach BS unterschiedlich interpretiert wird.
Auch da war Win7 wieder ein Problem. Also das installiere ich mir sicher nicht.

SendKeys in dem fall war/ist notwendig um in Excel das Passwort beim Schutz vor Ansicht des Vba-Codes aufzuheben.
Nix illegales, das Passwort ist ja bekannt.
Und dann super, haste Vba-Code der läuft auf WinXP, bei Win7 nicht :frowning:
Und hier im Brett waren doch auch schon 2-3 Dinge wo Win7 mit VB6.0 nicht harmoniert.

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

Nein, zum Glück, Quadrat ist Quadrat.

Sag Bescheid, wenn Deine Liste fertig ist.

Gerne, muß mal schauen, bei so langen laufzeiten muß ich genauestens prüfen ob die Startbedingungen (Ordnerwahl usw.) auch alle stimmen.
Keine Lust das mehrmals laufen zu lassen, hab keinen Gray als PC :smile:
Ich meld mich dann.

Gruß
Reinhard

hallo Rainer,

antworte ich gleich drauf, bin jetzt kurz mal weg.

Aber, was mir unabhängig vom Thema sofort ins Auge fiel, ist das:

Private Sub Form_Load()
Me.Show

Wieso noch Me.show?

Wenn ich da F5 drücke wird sie ja sowieso angezeigt *rätsel*

Gruß
Reinhard

Hallo Reinhard,

Aber, was mir unabhängig vom Thema sofort ins Auge fiel, ist
das:

Private Sub Form_Load()
Me.Show

Wieso noch Me.show?

Wenn ich da F5 drücke wird sie ja sowieso angezeigt *rätsel*

weil ich ohnehin Autoredraw auf True habe, war das überflüssig, da hast Du Recht.

Ohne Autoredraw ist aber das geprintete Zeichen weg, wenn die Form angezeigt wird. Dann muss die Form erst angezeigt werden und dann geprintet.

Was in Form_Load steht, wird ausgeführt, bevor die Form angezeigt wird, außer man schreibt ein Me.Show 'rein.

Gruß Rainer

Hallo Reinhard,

okay, muß man erstmal wissen. Ohne diese kenntnis hätt/habe
ich gedacht, ist die Picturebox zu klein, na und wird nur ein
Teil des Bildes angezeigt, wenn zu groß halt das Bild mit
Rand.

Nach meiner Deutung, wenn ich dann den Picturebox-Inhalt
auslese wäre der frei von Rand oder es fehlen auch keine
„Teile“ des Bildes die nicht angezeigt werden

Aber okay, du hast mir gesagt wie VB das sieht.

Nein. :smile:

Sieh noch mal in den Code. Wir lesen mit GetBismapBits nicht Picture1.Picture, sondern Picture1.Image. Das ist nicht das Selbe. Die Pictuerbox hat zwei Eigenschaften, die ein Bild enthalten und die sind nicht immer identisch.

.Picture ist das, was geladen wurde. .Image alles was im Pic zu sehen ist. Auch der graue Rand und nur die sichtbaren Teile des Bildes.

Gruß Rainer

Sag Bescheid, wenn Deine Liste fertig ist.

Hallo Rainer,

gerne. Der Test gestern Abend ging schief:frowning:
D.h., die Erstellung der zig bmps klappte nicht.

Kann also noch paar Nächte dauern, nur dann kann ich das mit so vielen Dateien testen, denn in der Zeit ist der Rechner blockiert bzw. auch API-sendkeys schreibt dann in falsche Fenster.

Mir noch sehr unklar warum es mit 100 Zeichen klappt, aber mit 65xxx nicht.

Ich bleibe am Ball.

PS: wegen gestern Abend, ich mußte nach kurzer Zeit den PC ausschalten, durch das API-SendKeys tauchten diverse Fensterchen von irfanview u.a. auf.
Weißt du auswendig wie ich da in die Schleife die von 32 bis 65536 läuft etwas einbaue was auf ESC reagiert?
Wenn nicht, nicht schlimm, dann schau ich mal im Internet.

Heute Abend teste ich nochmal so 5000 Dateien, im Code die Wartezeit durch Sleep nochmals deutlich erhöht. Mal schauen…
Im Erfolsfall klappt das, dann kann ich ja hochrechnen wieviele Bilder ich pro Nacht erstellen kann und löse dann das Problem durch paar Nächte Häppchenweise.

Wenn es aber nicht funktioniert bin ich wieder mal ratlso.

Gruß
reinhard

Hallo Reinhard,

gerne. Der Test gestern Abend ging schief:frowning:
D.h., die Erstellung der zig bmps klappte nicht.

Kann also noch paar Nächte dauern, nur dann kann ich das mit
so vielen Dateien testen, denn in der Zeit ist der Rechner
blockiert bzw. auch API-sendkeys schreibt dann in falsche
Fenster.

Mir noch sehr unklar warum es mit 100 Zeichen klappt, aber mit
65xxx nicht.

Hast Du mal meinen letzten versuch getestet?
Eventuell kannst Du Dir die .bmp sparen und hast das Ergebnis in wenigen Sekunden. Für mich sieht es danach aus.

Gruß Rainer