Problemchen bei meinem Projekt

  • Hallo!

    Zuerst mal eine Entschuldigung für den nicht aussagekräftigen Thread-Namen.
    Warum ich ihn gewählt habe wird hoffentlich beim Lesen meines Posts deutlich.

    Nach längerem experimentieren hab ich mich jetzt doch entschlossen euch um Rat und Hilfe zu bitten.
    Irgendwie versteh ich das Zusammenspiel von Bitmap-Objekt, Grafik-Objekt und Kontext nicht so ganz, was bei meinem aktuellen Projekt ein ganz schöner Stolperstein ist.

    Aktuell besteht kein Problem.
    (Wer sich nicht den ganzen Text antun möchte kann auch gleich bei: Zu meinem eigentlichen Problem runterscrollen)

    kurze Vorgeschichte:

    Spoiler anzeigen


    Ich arbeite in einer Wafer-Fab, zugegeben, nur als "Montagehelfer". Jetzt hat die Nachbarabteilung einen Gut-Chip-Zähler bekommen, der die "guten" Chips auf einem Wafer (Siliziumscheibe mit Chips, siehe: http://upload.wikimedia.org/wikipedia/comm…_bis_8_Zoll.jpg ) zählt.
    Das ganze ist, einfach ausgedrückt, nichts weiter als eine Kamera, die den Wafer abfotografiert und ein PC mit einer Software, die an vorher definierten Stellen nach einer Farbänderung sucht.
    Als ich die Software gesehen habe dachte ich mir, "Mensch, sowas kannst du doch mit AutoIt auch umsetzen". Denkste, ... aber es ist sicher möglich, wenn auch nicht ganz sinnvoll. Jedoch ganz gut geeignet um sich endlich mal mit GDI+ zu beschäftigen und was neues zu lernen.


    Was ich in meinem kleinen, großen Projekt denn überhaupt erreichen möchte und was ich bisher umgesetzt habe.

    Was ich im dem Projekt überhaupt machen möchte:

    Spoiler anzeigen


    [ ] - Eine GUI mit "Wizard-Funktion" zum anlegen neuer Gutchip-Erkennungs-Rezepte
    Hier will ich Dinge wie die Anzahl der zu findenden Chips, min-Qualität des zu findenden Bildes (Stichwort 'pattern', welches
    ich wohl Zukünftig eher verwende), etc. hinterlegen
    [ ] - Webcam-Aufnahme des Wafers
    [x] - Erkennen der Wafer-Dimensionen/-Kanten (funktioniert so weit am Testbild)
    [ ] - Rotationskontrolle, bzw. Drehung des Bildes, so dass das "Flat" (grade Kante am Wafer) oben ist
    [ ] - Abgleich eines vorher definierten Bildbereichs (pattern) (im Wizard) mit der aktuellen Aufnahme
    [ ] - eventuell die Möglichkeit der manuellen Justage der Parameter, falls das Ergebnis nicht den Erwartungen entspricht
    [ ] - Ausgabe des Ergebnis am Bildschirm und einem Textfile (was wohl das einzige ist, was ich ohne Probleme lösen kann)
    Für den Rest ist lernen, lernen, lernen und noch mehr probieren angesagt :)


    Da das ganze, wenn es denn mal funktioniert, auch für diesen Bot-Mist Verwendung finden könnte, scheu ich mich davor das ganze in einem etwas fertigerem Stadium zu veröffentlichen. Wie ist euere Meinung dazu?

    Zu meinem eigentlichen Problem - gelöst:
    Was ich ein wenig entmutigt hatte, war die Tatsache, dass ich in einem so frühen Stadium bereits an meine Grenzen zu stoßen schien. Aber hey, ich will ja was lernen bei der Sache.

    Mein bisheriger Code, von unnötigem beeinigt:

    Spoiler anzeigen
    [autoit]


    #cs ----------------------------------------------------------------------------
    AutoIt Version: 3.3.6.1
    Author: fred
    Script Function: edge-finding & rect-drawing
    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <array.au3>
    #Include <Timers.au3>
    #include <GDIPlus.au3>
    #include <GDIP.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;#include <ScreenCapture.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; GLOBALE VARIABLEN
    Global $hBitmap_work, $hBitmap_show, $hGraphic; Handle der Bilder
    Global $GUI_windowhandle; testweise

    [/autoit] [autoit][/autoit] [autoit]

    ; Bessere Lösung bekannt und wird im späteren Verlauf umgesetzt...
    Global $return_x_left_temp[6]; Array-Rückgabe vom ersten Durchlauf von "wafer_align_horizontal()"
    Global $return_BMP_Info[5]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $iX
    Global $iY

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; GUI-VARIABLEN
    Global $btn_1

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Opt("GuiOnEventMode", 1)
    Opt("GUICloseOnESC", 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $GUI_Form = GUICreate('test-edge-finder', 1000, 700 )
    $btn_1 = GUICtrlCreateButton ( "Ausführen was hinterlegt ist (test)", 890, 600, 100 , 75, $BS_MULTILINE )
    GUICtrlSetOnEvent(-1, 'image_perform'); Funktion definieren (--> Button-Click)
    GUISetState(@SW_SHOW, $GUI_Form )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit" ); Funktion zum Beenden definieren

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $return_BMP_Info = pre_GIU_Funktion()

    [/autoit] [autoit][/autoit] [autoit]

    $iX = $return_BMP_Info[1]; Bildbreite
    $iY = $return_BMP_Info[2]; Bildhöhe
    $hBitmap_show = $return_BMP_Info[3]; Bitmap-Handle - Bild das angezeigt wird

    [/autoit] [autoit][/autoit] [autoit]

    show_in_GUI($GUI_Form, $hBitmap_show, $iX, $iY )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $start = 1
    While $start
    Sleep(250)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; ############ Start - FUNKTIONSDEFINITIONEN #########################
    Func pre_GIU_Funktion()

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup (); Initialize GDI+ library

    [/autoit] [autoit][/autoit] [autoit]

    $sFileName = @ScriptDir & "\wafer.bmp"; Pfad & Dateinamen zum Bild (BMP)
    $hBitmap_work = _GDIPlus_BitmapCreateFromFile($sFileName); Returns: Handle to a Bitmap object
    $hBitmap_show = $hBitmap_work; Dubliziere BitmapHandle

    [/autoit] [autoit][/autoit] [autoit]

    $iX = _GDIPlus_ImageGetWidth($hBitmap_work); Bildbreite
    $iY = _GDIPlus_ImageGetHeight($hBitmap_work); Bildhöhe

    [/autoit] [autoit][/autoit] [autoit]

    ; Rückgabewerte setzen
    ;$return_BMP_Info[5]
    $return_BMP_Info[0] = 2; Anzahl der Rückgabewerte
    $return_BMP_Info[1] = $iX; Bildbreite
    $return_BMP_Info[2] = $iY; Bildhöhe
    $return_BMP_Info[3] = $hBitmap_show; Bitmap-Handle - Bild das angezeigt wird
    $return_BMP_Info[4] = $hBitmap_work; Bitmap-Handle - Bild das bearbeitet wird
    Return $return_BMP_Info

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; ##################################################################
    Func show_in_GUI($GUI_windowhandle, $bitmap2show, $iW, $iH )
    ;~ Local $GUI_windowhandle; windows handle to show bitmap in
    ;~ Local $bitmap2show; Bitmap Handle
    ;~ ; not used -Local $iX; The X coordinate of the upper left corner of the rendered image
    ;~ ; not used -Local $iY; The Y coordinate of the upper left corner of the rendered image
    ;~ Local $iW; Specifies the width of the destination rectangle at which to draw the image
    ;~ Local $iH; Specifies the height of the destination rectangle at which to draw the image

    [/autoit] [autoit][/autoit] [autoit]

    ; START - Anzeige in GUI
    ;Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($GUI_windowhandle)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($GUI_windowhandle)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap_show, 0, 0, $iW, $iH ) ;die Figur wird an der neuen Position gezeichnet
    ; ENDE - Anzeige in GUI
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; $iX=Bildbreite $iY=Bildhöhe
    Func wafer_align_horizontal($iX, $iY)

    [/autoit] [autoit][/autoit] [autoit]

    ; Variablen
    Local $y_axis_max = $iY; max-Wert der Y-Achse
    Local $x_axis_max = $iX-2; max-Wert der X-Achse-- TESTWEISE
    Local $x_axis_part_A_max = $iX / 2; linke Seite max-Wert
    Local $x_axis_part_B_init = $x_axis_part_A_max; rechte Seite start-Wert
    Local $step = 20; Schrittweite für Überprüfung

    [/autoit] [autoit][/autoit] [autoit]

    Local $starttime = _Timer_Init(); Timer initialisieren (für Laufzeit edge-finding horizontal-left)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; x- & y-Positionen zu Beginn der Funktion setzen
    Local $cord_x_left_min = $x_axis_part_A_max; Var der x-cord des zuletzt gefundenen min-Werts
    Local $cord_x_left_min_old = 0 ;$x_axis_max; Var der x-cord des zuvor gefundenen min-Werts
    Local $row_cord_left_of_min_x = 0; Var der y-cord des zuletzt gefundenen Werts
    Local $row_cord_left_of_min_x_old = 0; Var der y-cord des zuvor gefundenen Werts

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; jede Zeile prüfen ... von y-Achse=1 bis y-Achse=Bildhöhe
    For $y_axis=1 To $y_axis_max Step $step; ### START - Bild vertikal abarbeiten

    [/autoit] [autoit][/autoit] [autoit]

    ; erstes Pixel der Zeile einlesen
    Local $init_pixel = _GDIPlus_BitmapGetPixel($hBitmap_work, 1, $y_axis) ; init-Pixel, gegen das wir prüfen (1. Pixel in jeder Zeile)

    [/autoit] [autoit][/autoit] [autoit]

    ; jedes Pixel der Zeile gegen das erste auf Änderung prüfen
    For $x_axis=1 To $x_axis_part_A_max ; ####################### START - jedes Pixel der Zeile prüfen - LEFT

    [/autoit] [autoit][/autoit] [autoit]

    Local $left_side_pixel = _GDIPlus_BitmapGetPixel($hBitmap_work, $x_axis, $y_axis ); jedes Pixel der Zeile (linke Seite) einlesen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $init_pixel = $left_side_pixel Then; Pixel noch NICHT gefunden
    ; nichts unternehmen

    [/autoit] [autoit][/autoit] [autoit]

    ; ### Bei Fund eines geänderten Pixels
    Else; $init_pixel != $left_side_pixel ; geändertes Pixel gefunden

    [/autoit] [autoit][/autoit] [autoit]

    If $cord_x_left_min > $x_axis Then
    $cord_x_left_min_old = $cord_x_left_min
    $cord_x_left_min = $x_axis
    $row_cord_left_of_min_x_old = $row_cord_left_of_min_x
    $row_cord_left_of_min_x = $y_axis
    ; Kontrollmeldung
    ; MsgBox(0,"INFO","IF-Fall --> '$cord_x_left_min > $x_axis' --> 'ExitLoop' ausgeführt" )
    ExitLoop; innere FOR-Schleife verlassen

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $cord_x_left_min < $x_axis Then ;AND $cord_x_left_min <> $x_axis_part_A_max Then
    $cord_x_left_min_old = $cord_x_left_min
    $cord_x_left_min = $x_axis
    $row_cord_left_of_min_x_old = $row_cord_left_of_min_x
    $row_cord_left_of_min_x = $y_axis

    [/autoit] [autoit][/autoit] [autoit]

    ; Kontrollmeldung
    ;~ MsgBox(0,"INFO","ElseIF-Fall --> '$cord_x_left_min < $x_axis' --> 'ExitLoop 2' ausgeführt" & @CRLF & _
    ;~ "$cord_x_left_min = " & $cord_x_left_min_old & " #|# $x_axis = " & $cord_x_left_min & @CRLF & _
    ;~ "$row_cord_left_of_min_x = " & $row_cord_left_of_min_x )

    [/autoit] [autoit][/autoit] [autoit]

    ExitLoop 2; beide FOR-Schleifen verlassen

    [/autoit] [autoit][/autoit] [autoit]

    Else
    ; Kontrollmeldung
    ;~ MsgBox(0, "Info","Else-Fall --> '$cord_x_left_min = $x_axis' --> 'ExitLoop' ausgeführt" & @CRLF & _
    ;~ "X - Aktueller min-Wert (Links): " & $x_axis & @CRLF & _
    ;~ "Y - Aktueller y-Wert (Links): " & $y_axis & @CRLF & _
    ;~ "$cord_x_left_min = " & $cord_x_left_min & " #|# $x_axis = " & $x_axis )

    [/autoit] [autoit][/autoit] [autoit]

    ExitLoop; innere FOR-Schleife verlassen

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndIf
    Next; ############################################################### ENDE - jedes Pixel der Zeile prüfen - LEFT

    [/autoit] [autoit][/autoit] [autoit]

    Next; ### ENDE - Bild vertikal abarbeiten

    [/autoit] [autoit][/autoit] [autoit]

    Local $runtime_left = Round( _Timer_Diff($starttime), 2)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "Info","Funktionsdauer (Links): " & $runtime_left & "ms" & @CRLF & _
    "X - Erster min-Wert (Links): " & $cord_x_left_min_old & @CRLF & _
    "Y - Erster, kleinster y-Wert (Links): " & $row_cord_left_of_min_x_old & @CRLF & _
    "X - Letzter min-Wert (Links): " & $cord_x_left_min & @CRLF & _
    "Y - Letzter, kleinster y-Wert (Links): " & $row_cord_left_of_min_x )

    [/autoit] [autoit][/autoit] [autoit]

    $return_x_left_temp[0] = $runtime_left
    $return_x_left_temp[1] = $cord_x_left_min
    $return_x_left_temp[2] = $cord_x_left_min_old
    $return_x_left_temp[3] = $row_cord_left_of_min_x
    $return_x_left_temp[4] = $row_cord_left_of_min_x_old
    $return_x_left_temp[5] = $step

    [/autoit] [autoit][/autoit] [autoit]

    Return $return_x_left_temp

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>wafer_align_horizontal

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func wafer_align_horizontal_rigid($return_x_left)

    [/autoit] [autoit][/autoit] [autoit]

    $runtime_left = $return_x_left[0]
    $cord_x_left_min = $return_x_left[1]
    $cord_x_left_min_old = $return_x_left[2]
    $row_cord_left_of_min_x = $return_x_left[3]
    $row_cord_left_of_min_x_old = $return_x_left[4]
    $step_used = $return_x_left[5]

    [/autoit] [autoit][/autoit] [autoit]

    Local $upper_left = $cord_x_left_min_old
    Local $lower_left = $cord_x_left_min

    [/autoit] [autoit][/autoit] [autoit]

    If $upper_left < $lower_left Then
    $lower_left = $upper_left
    Else
    $upper_left = $lower_left
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Variablen
    Local $x_axis_part_A_max = $iX / 2; linke Seite max-Wert
    Local $schalter1 = 0

    [/autoit] [autoit][/autoit] [autoit]

    Local $y_axis_max = $iY; max-Wert der Y-Achse
    Local $x_axis_max = $iX-2; max-Wert der X-Achse-- TESTWEISE
    Local $x_axis_part_B_init = $x_axis_part_A_max; rechte Seite start-Wert
    ;Local $step = 20; Schrittweite für Überprüfung

    [/autoit] [autoit][/autoit] [autoit]

    Local $starttime = _Timer_Init(); Timer initialisieren (für Laufzeit edge-finding horizontal-left)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $y_axis=$row_cord_left_of_min_x_old - $step_used To $row_cord_left_of_min_x + $step_used; ### START - Bild vertikal abarbeiten

    [/autoit] [autoit][/autoit] [autoit]

    Local $init_pixel = _GDIPlus_BitmapGetPixel($hBitmap_work, 1, $y_axis); $i=$y_axis --> ; erstes Pixel der Zeile einlesen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #### START - jedes Pixel der Zeile gegen das erste auf Änderung prüfen (links) ####
    For $x_axis=1 To $x_axis_part_A_max
    Local $left_side_pixel = _GDIPlus_BitmapGetPixel($hBitmap_work, $x_axis, $y_axis ); jedes Pixel der Zeile (linke Seite) einlesen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $init_pixel = $left_side_pixel Then; Pixel noch NICHT gefunden
    ; nichts unternehmen

    [/autoit] [autoit][/autoit] [autoit]

    Else; $init_pixel != $left_side_pixel ; geändertes Pixel gefunden

    [/autoit] [autoit][/autoit] [autoit]

    If $x_axis > $cord_x_left_min Then
    ; nichts machen, da nicht der "Max-Radius"
    ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $x_axis = $cord_x_left_min And $schalter1=0 Then
    $cord_x_left_min_old = $x_axis
    $row_cord_left_of_min_x_old = $y_axis
    $cord_x_left_min = $x_axis
    $row_cord_left_of_min_x = $y_axis
    $schalter1=1
    ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $x_axis = $cord_x_left_min And $schalter1=1 Then
    $cord_x_left_min = $x_axis
    $row_cord_left_of_min_x = $y_axis
    ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $x_axis < $cord_x_left_min Then
    $cord_x_left_min_old = $x_axis; letzte Position auf x-Achse
    $row_cord_left_of_min_x_old = $y_axis; letzte Position auf y-Achse
    $cord_x_left_min = $x_axis; aktuelle Position auf der x-Achse
    $row_cord_left_of_min_x = $y_axis; aktuelle Position auf der y-Achse
    $schalter1=1
    ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $x_axis > $cord_x_left_min And $schalter1=1 Then
    ExitLoop 2; beide FOR-Schleifen verlassen

    [/autoit] [autoit][/autoit] [autoit]

    Else
    ; nichts machen, da in einem nicht definierten Zustand

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    Next; ############################################################### ENDE - jedes Pixel der Zeile prüfen - LEFT
    Next; ############################################################### ENDE - Bild vertikal abarbeiten

    [/autoit] [autoit][/autoit] [autoit]

    Local $min_left = $cord_x_left_min
    Local $min_left_row = $row_cord_left_of_min_x_old - $row_cord_left_of_min_x
    $min_left_row = $min_left_row /2
    $min_left_row = $row_cord_left_of_min_x + $min_left_row

    [/autoit] [autoit][/autoit] [autoit]

    Local $runtime_left = Round( _Timer_Diff($starttime)+$runtime_left, 2)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "Info","Funktionsdauer Links (Insgesamt): " & $runtime_left & "ms" & @CRLF & _
    "X - Minimaler X-Wert Links (größter 'Radius'): " & $min_left & @CRLF & _
    "Y - Zeile des min-Wert-Y: " & $min_left_row )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $return_x_left_temp[0] = $runtime_left
    $return_x_left_temp[1] = $min_left
    $return_x_left_temp[2] = $min_left_row

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Return $return_x_left_temp

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _draw_a_line($Param)
    ; Syntax.........: _GDIPlus_GraphicsDrawLines($hGraphics, $aPoints[, $hPen = 0])
    ; Parameters ....: $hGraphics - Pointer to a Graphics object
    ; $aPoints - Array of points that specify the starting and ending points of the lines:
    ; |[0][0] - Number of points
    ; |[1][0] - Point 1 X position
    ; |[1][1] - Point 1 Y position
    ; |[2][0] - Point 2 X position
    ; |[2][1] - Point 2 Y position
    ; |[n][0] - Point n X position
    ; |[n][1] - Point n Y position
    ; $hPen - Handle to a pen object that is used to draw the splines. If 0, a solid black pen with a width of
    ; +1 will be used.

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $min_left
    $min_left = $Param[1]

    [/autoit] [autoit][/autoit] [autoit]

    $hGraphicContext = _GDIPlus_ImageGetGraphicsContext ($hGraphic)
    _GDIPlus_GraphicsDrawLine($hGraphic, $min_left, 20, $min_left, 500 )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func image_perform()
    wafer_align_horizontal($iX, $iY)
    $return_x_left_temp = wafer_align_horizontal_rigid($return_x_left_temp)
    _draw_a_line($return_x_left_temp)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _exit()

    [/autoit] [autoit][/autoit] [autoit]

    ; Clean up resources
    _GDIPlus_BitmapDispose ($hBitmap_show)
    _GDIPlus_BitmapDispose ($hBitmap_work)
    _GDIPlus_GraphicsDispose($hGraphic)
    ; OLD_WinAPI_DeleteObject ($hBitmap_object)

    [/autoit] [autoit][/autoit] [autoit]

    ; Shut down GDI+ library
    _GDIPlus_ShutDown ()

    [/autoit] [autoit][/autoit] [autoit]

    exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; ############ Ende - FUNKTIONSDEFINITIONEN #########################

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; $iX=Bildbreite $iY=Bildhöhe
    Func wafer_align_vertikal($iX, $iY)

    [/autoit] [autoit][/autoit] [autoit]

    ; ...

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>wafer_align_vertical

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]


    Benötigt wird noch das Testbild: 'wafer.bmp' im Skriptordner
    wafer.bmp

    Die Stelle, die mir Kopfzerbrechen bereitet hatte - gelöst:
    Wieso ich den Grafikkontext erzeugen muss, aber ins Grafikobjekt zeichne, versteh ich immer noch nicht.

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _draw_a_line($Param)
    $hGraphicContext = _GDIPlus_ImageGetGraphicsContext ($hGraphic)
    _GDIPlus_GraphicsDrawLine($hGraphic, $min_left, 20, $min_left, 500 )

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit]


    Vielleicht hat trotzdem noch jemand eine Idee, wie sich die Kantenfindungs-Funktion besser/schneller umsetzen lässt.

    Wenn es genehm ist werde ich in diesem Thread weitere Fragen und Probleme zu diesem Projekt stellen und den Ausgangs-Thread den Fortschritten entsprechend editieren. Oder macht es mehr Sinn das ganze in "Projekte" zu verlagern?

    Ich bedanke mich schon mal bei allen, die bis hierhin durchgehalten haben ;)

    MfG Freddy

    2 Mal editiert, zuletzt von fredowsky (25. September 2011 um 12:25)