Bilder 'includen'

  • Hallo!

    Hier mein neuestes Skript.

    Make PicInclude.au3
    [autoit]

    #include <GDIPlus.au3>

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

    Local $iMsg = MsgBox(36, 'Datei auswählen?', 'Möchten Sie eine Datei auswählen?')
    Local $picfile = ""
    If $iMsg = 6 Then
    $picfile = FileOpenDialog('Bild auswählen', @ScriptDir, 'Bilder (*.jpg;*.bmp)')
    Local $array = _Scan_Pic($picfile)
    Else
    Local $array = _Scan_Pic($picfile, 100, 50, 200, 200)
    EndIf

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

    Local $string = _Array2dToString($array)
    Local $file = @ScriptDir & '\IncludePic\IncludePic' & @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & '.au3'
    Local $Funcfile = @ScriptDir & '\IncludePic\IncludePicFunc.au3'
    ClipPut('#include "' & $file & '"' & @CRLF)

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

    Local $hFuncfile = FileOpen($Funcfile, 10)
    FileWriteLine($hFuncfile, '#include-once')
    FileWriteLine($hFuncfile, '')
    FileWriteLine($hFuncfile, 'Func _StringToArray2D($sArray)')
    FileWriteLine($hFuncfile, ' ;funkey')
    FileWriteLine($hFuncfile, ' Local $i_extended, $ar_Row, $ar = StringSplit($sArray, @LF, 2)')
    FileWriteLine($hFuncfile, ' StringReplace($ar[0], "|", @LF)')
    FileWriteLine($hFuncfile, ' $i_extended = @extended + 1')
    FileWriteLine($hFuncfile, ' Local $ar2D[$i_extended][UBound($ar)]')
    FileWriteLine($hFuncfile, ' For $i = 0 To UBound($ar2D, 2) - 1')
    FileWriteLine($hFuncfile, ' $ar_Row = StringSplit($ar[$i], "|", 2)')
    FileWriteLine($hFuncfile, ' For $j = 0 To UBound($ar2D, 1) - 1')
    FileWriteLine($hFuncfile, ' $ar2D[$j][$i] = $ar_Row[$j]')
    FileWriteLine($hFuncfile, ' Next')
    FileWriteLine($hFuncfile, ' Next')
    FileWriteLine($hFuncfile, ' Return $ar2D')
    FileWriteLine($hFuncfile, 'EndFunc ;==>_StringToArray2D')
    FileClose($hFuncfile)

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

    Local $hfile = FileOpen($file, 10)
    FileWriteLine($hfile, '#include <' & $Funcfile & '>')
    FileWriteLine($hfile, '')
    FileWriteLine($hfile, "Local $sPic = ''")
    FileWriteLine($hfile, StringTrimRight("$sPic &= '" & StringReplace($string, @LF, "' & @LF" & @LF & "$sPic &= '"), 17))
    FileWriteLine($hfile, '')
    FileWriteLine($hfile, 'Local $aPic = _StringToArray2D($sPic)')
    FileWriteLine($hfile, '')
    FileWriteLine($hfile, 'Local $LastCol = ""')
    FileWriteLine($hfile, 'For $j = 0 To UBound($aPic, 2) - 1')
    FileWriteLine($hfile, ' For $i = 0 To UBound($aPic, 1) - 1')
    FileWriteLine($hfile, ' If $aPic[$i][$j] = "" Then ContinueLoop')
    FileWriteLine($hfile, ' If $LastCol <> $aPic[$i][$j] Then')
    FileWriteLine($hfile, ' GUICtrlSetGraphic(-1, 8, $aPic[$i][$j])')
    FileWriteLine($hfile, ' $LastCol = $aPic[$i][$j]')
    FileWriteLine($hfile, ' EndIf')
    FileWriteLine($hfile, ' GUICtrlSetGraphic(-1, 18, $i, $j)')
    FileWriteLine($hfile, ' Next')
    FileWriteLine($hfile, 'Next')
    FileClose($hfile)

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

    MsgBox(64, 'Fertig', 'Die "IncludePic-Datei" wurde erfolgreich erstellt!' & @CRLF & 'Das Ergebnis wurde in die Zwischenablage kopiert.')

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

    Func _Scan_Pic($sSource, $iPosx = -1, $iPosy = -1, $iWidth = -1, $iHeight = -1)
    ;funkey
    If FileExists($sSource) Then
    _GDIPlus_Startup()
    Local $IMAGE = _GDIPlus_ImageLoadFromFile($sSource)
    $iWidth = _GDIPlus_ImageGetWidth($IMAGE)
    $iHeight = _GDIPlus_ImageGetHeight($IMAGE)
    _GDIPlus_ImageDispose($IMAGE)

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

    Local $GUI = GUICreate('Bild', $iWidth, $iHeight, -1, -1, 0x80000000)
    GUISetBkColor(0xFFFFFF)
    Local $PICTURE = GUICtrlCreatePic($sSource, 0, 0, $iWidth, $iHeight)
    GUISetState(@SW_SHOW, $GUI)
    Local $WinPos = WinGetPos('Bild')
    $iPosx = $WinPos[0]
    $iPosy = $WinPos[1]
    EndIf
    Local $aPic[$iWidth][$iHeight]
    For $j = 0 To $iHeight - 1
    For $i = 0 To $iWidth - 1
    $aPic[$i][$j] = PixelGetColor($iPosx + $i, $iPosy + $j)
    Next
    Next
    Return $aPic
    EndFunc ;==>_Scan_Pic

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

    Func _Array2dToString($ar2D)
    ;funkey
    Local $sMsg = ""
    For $yCounter = 0 To UBound($ar2D, 2) - 1
    For $xCounter = 0 To UBound($ar2D) - 1
    $sMsg &= $ar2D[$xCounter][$yCounter] & '|'
    Next
    $sMsg = StringTrimRight($sMsg, 1) & @LF
    Next
    Return $sMsg
    EndFunc ;==>_Array2dToString

    [/autoit]


    Dieser Code erzeugt aus einer Bild-Datei oder direkt von der Bildschirmanzeige eine Datei, die einfach nach einem GUICtrlCreateGraphic includet wird. In die Zwischenablage wird dann '#include ...' geschrieben.

    Fertiges Skript sieht dann im einfachsten Fall so aus:

    Spoiler anzeigen
    [autoit]

    GUICreate("Pic-Include-Test", 500, 500)

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

    GUICtrlCreateGraphic(0, 0) ; <--Position des Bildes festlegen
    #include "C:\Dokumente und Einstellungen\.....\Desktop\IncludePic\IncludePic20090706130040.au3" ; <---hier den Include aus der Zwischenablage einfügen

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

    GUISetState()

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

    Do
    Until GUIGetMsg() = -3

    [/autoit]


    Die Bilder dürfen nicht zu groß sein (max. ca. 200x200) , ansonsten läuft das Skript bei mir super. Man kann beliebig viele Dateien 'includen'

    Freue mich auf Rückmeldungen!

  • servus...

    Die Idee ist suuuper... aber nur noch etwas langsam das ganze... besonders das includen?
    geht das nicht schneller mit der bmp UDF ? dann brauchste das bild nicht öffnen und Pixelsearch nicht...

    habe es noch nicht getestet.. aber müsste eigentlich gehen

    MFG chris :D

    EDIT: Habe mal die bmp.au3 angehangen...... da gibbet sowas wie _PixelRead()

  • Die bmp-udf muss ich mir noch anschauen.

    Ich weiß es ist ein wenig langsam wenn man größere Bilder damit anzeigen will. Dafür ist es auch nicht wirklich geeignet, da damit die Include Dateien auch ziemlich groß werden. Aber für Kleine Bilder funktioniert es super. Mir ist leider kein gutes Beispiel für die Verwendung eingefallen, hab aber trotzdem mal was angehängt.