Quote:
Algorithmus[Bearbeiten]
Das Muster wird am Anfang linksbündig unter den Text geschrieben und dann von rechts nach links Zeichen für Zeichen mit dem Text verglichen. Sobald ein Mismatch auftritt, berechnen zwei Heuristiken, wie weit das Suchmuster nach rechts verschoben werden kann.
Bad-Character-Heuristik
Stimmt beim Vergleich des Musters mit dem Text von rechts nach links ein Zeichen des Musters nicht mit dem Zeichen des Textes überein („Bad-Character“), wird im Muster nach dem letzten Vorkommen dieses Bad-Characters gesucht und das Muster soweit verschoben, bis beide Buchstaben übereinander liegen. Existiert dieser Bad-Character nicht im Muster, wird das Muster um seine volle Länge nach rechts verschoben. Es kann vorkommen, dass die Bad-Character-Heuristik eine Verschiebung des Musters nach links vorschlägt. In diesem Fall wird um eine Position nach rechts geschoben.
Good-Suffix-Heuristik
Stimmt beim Vergleich des Musters mit dem Text von rechts nach links ein Suffix des Musters mit dem Text überein und tritt danach aber ein Mismatch auf, wird das Muster soweit nach rechts geschoben, bis ein Teilwort des Musters wieder auf das Suffix passt. Existiert das Suffix kein zweites Mal im Muster, wird das Muster um seine volle Länge nach rechts verschoben.
Es kommt vor, dass die beiden Heuristiken unterschiedliche Verschiebungen berechnen. Der Algorithmus wählt immer das Maximum der beiden Vorschläge, um das Muster nach rechts zu verschieben.
Um das Vorgehen effizient zu gestalten, wird für beide Heuristiken in einem Vorverarbeitungsschritt jeweils eine Sprungtabelle errechnet. Die Sprungtabelle für die Bad-Character-Heuristik enthält für jedes im Suchmuster vorkommende Zeichen den Abstand von der Position des letzten Vorkommens im Suchmuster bis zum Ende des Suchmusters. Die Tabelle für die Good-Suffix-Heuristik enthält für jedes Teilmuster (von hinten aus gesehen) den Abstand vom Ende des Musters, ab dem es wieder im Muster vorkommt. Eine detailliertere Beschreibung des Algorithmus findet sich im entsprechenden Artikel in der englischen Wikipedia.
|
https://de.wikipedia.org/wiki/Boyer-Moore-Algorithmus
Die Koordinaten kann man einfach zurückrechnen.
Ich gehe davon aus, dass hier der DeviceContext(getDC) genutzt wird um eine DI_RGB/DIB_RGB_COLORS Bitmap (24 oder 32 Bit) zu erhalten. Dies ist zumindest der schnellste Weg ein Bild zu erhalten.
die Bitmap ist im Format BGRBGRBGR... gespeichert. BGR ! nicht RGB ! Die Bitmap, die man über Bitblt(SRCCOPY) erhält, gibt die Farbwerte Rückwärts aus.
Zudem wird bei positiver höhe das Bild "auf dem Kopf" generiert..
Wähle eine Negative Höhe um das Bild "richtig herum" im Speicher abzulegen.
Ausgehend davon erhalten wir ein pixel an der Position x,y durch die Formel:
(y* HaystackBreite + x )* Bittiefe / 8
HaystackBreite sei hier die Breite des großen Bildes.. also vermutlich die Desktopbreite.
Diese Gleichung kann man einfach Umstellen um das gewünschte Ergebnis zu erhalten