Hallo zusammen,
ich bin nicht ganz neu, was die Nutzung von Autoit angeht, allerdings auch kein Profi und habe ein Problem, welches mich schon ein paar Tage beschäftigt, weshalb ich nun hoffe bei euch eine Erklärung dafür zu finden.
Ich arbeite gerade an einem selbstlernenden Programm, welches versucht Formen zu erkennen, zu speichern und wieder zu finden. Dafür habe ich zwei Funktionen, die für sich auch beide funktionieren, nur wenn ich sie kombiniere kommt ein Fehler dabei heraus, der die Imagesearch Funktion unterbricht und wie folgt lautet:
$result= DllCall("ImageSearchDLL.dll", "str", "Imagesearch", "int" $x1, "int", $y1, "int" $right, "int", $bottom, "str", $findImage, "ptr", $HBMP)
^Error
Error: Variable used without being declared.
Wie gesagt, für sich funktioniert die ImageSearch Funktion problemlos nur in Kombination mit den folgenden Funktionen nicht. Ich kann den Code leider nicht verkürzen, da ich nicht weiß, was mein Problem hervorruft. Ich wäre euch echt dankbar, wenn jemand mein Wissen mit zumindest einem hilfreichen Hinweis erhellen könnte.
Func _ImageReference($path, $name, $number)
Opt("MustDeclareVars", 1)
_GDIPlus_Startup()
Dim $pixelarray
Dim $referenceArray
Local $arrayWidth = 0
Local $arrayHeight = 0
Local $reference = $path & $name & "1.png" ; "image1-before.png" ;
Local $file_in = $path & $name & $number & ".png" ; "image1-before.png" ;
Local $file_out = $path & $name & $number & ".png"
_FileImageToArray($file_in, $pixelarray, $arrayWidth, $arrayHeight)
_FileImageToArray($reference, $referenceArray, $arrayWidth, $arrayHeight)
;Turn pre defined Areas black
For $y = 0 To $arrayHeight - 1 Step 1
For $z = 0 To $arrayWidth - 1 Step 1
If $referenceArray[$z][$y] = "FFFFFFFF" Then
$pixelarray[$z][$y] = "FFFFFFFF"
EndIf
Next
Next
_FileArrayToImage($file_out, $pixelarray)
_GDIPlus_Shutdown()
EndFunc ;==>_ImageReference
Func _FileImageToArray($filename, ByRef $aArray, ByRef $arrayWidth, ByRef $arrayHeight)
Local $Reslt, $stride, $format, $Scan0, $iW, $iH, $hImage
Local $v_Buffer, $width, $height
Local $i, $j
$hImage = _GDIPlus_ImageLoadFromFile($filename)
$iW = _GDIPlus_ImageGetWidth($hImage)
$iH = _GDIPlus_ImageGetHeight($hImage)
$Reslt = _GDIPlus_BitmapLockBits($hImage, 0, 0, $iW, $iH, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
;Get the returned values of _GDIPlus_BitmapLockBits ()
$width = DllStructGetData($Reslt, "width")
$height = DllStructGetData($Reslt, "height")
$stride = DllStructGetData($Reslt, "stride")
$format = DllStructGetData($Reslt, "format")
$Scan0 = DllStructGetData($Reslt, "Scan0")
$arrayHeight = $height
$arrayWidth = $width
Dim $aArray[$width][$height]
For $i = 0 To $iW - 1
For $j = 0 To $iH - 1
$v_Buffer = DllStructCreate("dword", $Scan0 + ($j * $stride) + ($i * 4))
$aArray[$i][$j] = Hex(DllStructGetData($v_Buffer, 1), 8)
Next
Next
_GDIPlus_BitmapUnlockBits($hImage, $Reslt)
_GDIPlus_ImageDispose($hImage)
Return
EndFunc ;==>_FileImageToArray
Func _FileArrayToImage($filename, $aArray)
Local $iW = UBound($aArray, 1), $iH = UBound($aArray, 2), $sResult = ""
Local $hBMP2, $hImage1, $Reslt, $width, $height, $stride, $format, $Scan0
Local $sResult, $v_BufferA
Local $i, $j
$hBMP2 = _WinAPI_CreateBitmap($iW, $iH, 1, 32)
$hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBMP2)
$Reslt = _GDIPlus_BitmapLockBits($hImage1, 0, 0, $iW, $iH, $GDIP_ILMWRITE, $GDIP_PXF32ARGB)
;Get the returned values of _GDIPlus_BitmapLockBits ()
$width = DllStructGetData($Reslt, "width")
$height = DllStructGetData($Reslt, "height")
$stride = DllStructGetData($Reslt, "stride")
$format = DllStructGetData($Reslt, "format")
$Scan0 = DllStructGetData($Reslt, "Scan0")
$v_BufferA = DllStructCreate("DWORD[" & $height * $width & "]", $Scan0)
For $j = 0 To $height - 1
For $i = 0 To $width - 1
DllStructSetData($v_BufferA, 1, Execute("0x" & $aArray[$i][$j]), ($j * $width) + $i + 1) ; "+1" - base 1.
Next
Next
_GDIPlus_BitmapUnlockBits($hImage1, $Reslt)
_GDIPlus_ImageSaveToFile($hImage1, $filename)
_GDIPlus_ImageDispose($hImage1)
_WinAPI_DeleteObject($hBMP2)
Return
EndFunc ;==>_FileArrayToImage
Alles anzeigen
Viele Grüße und vielen Dank vorab an jeden der sich die Mühe macht hier mal drüber zu schauen.
Lösung des Problems war: Entweder in Imagesearch die Variablen korrekt deklarieren oder aber die Anweisung "Opt("MustDeclareVars", 1)" entfernen