Kleines GDI+ Malprogramm

  • Moin,

    Das hier ist nur ein kleiner Test, aber da ich hier im Forum schon weitaus schlechtere Versionen dieses Programms gesehen habe mache ich es mal öffentlich :D
    (So können Anfänger ggf etwas aus dem Skript lernen, für Fortgeschrittene ist das ja nix tolles :P)
    Es ist ein Malprogramm (nur Linien) wo man Farben und einige andere Aspekte variieren kann.
    Bilder können als .png gespeichert werden, Export und Import (einfach das LinienArray kopiert und komprimiert) ist möglich. ClipGet + ClipPut
    (Die Kompression ist noch nicht berauschend, aber es funktioniert schonmal)

    Edit: Die benötigte UDF gibts hier: Colorpicker UDF
    - Update: 19.04.13a
    | Kompression um ca. 30% erhöht (da geht eventuell aber noch mehr)
    | Performance erhöht (manchmal muss nur die letzte Linie gezeichnet werden anstatt alle)
    - Update: 24.04.13a
    | Kompression nochmals um ca. 50% erhöht (vorhandenes muss aber neu gemalt werden...)

    Skript
    [autoit]

    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <GDIPlus.au3>
    #include <Misc.au3>
    #include <Array.au3>
    #include <Colorpicker.au3>

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

    Opt('GUIOnEventMode', 1)
    Opt('MouseCoordMode', 2)

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

    Global Const $iW = 550
    Global Const $iH = 550
    Global Const $sVersion = '24.04.13'

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

    Global $hGUI, $hIMG, $hBUF, $hGFX, $hDC, $aPos, $aDown[2], _
    $aLines[1][7], $xIMG, $xGFX, $xDC, $hPEN, $hPicker, $hPicker2, _
    $hBtnSave, $hDickeWahl, $hComboDicke, $sTMP, $hComboCap, _
    $aCaps[3] = ['Kreis', 'Dreieck'], $aCapsI[3] = [2, 3], $hComboLen, _
    $aPalette[64], $hBtnExport, $hBtnImport, $hBtnClear, $vCurBuf, $xDcCur, $xGfxCur, $LinePen, $hBtnDel, $hBtnDel10

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

    ; Einstellbar
    Global $iMaxLen = 5, $iCol = 0, $iWidth = 5, $iEnd = 2, $iBkCol = 63

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

    ; Lines:
    ; 0 - 3 - x1, y1, x2, y2
    ; 4 - Farbe (erstmal 32Bit)
    ; 5 - Dicke (1px, 2px ->)
    ; 6 - Enden (Rund, Eckig, usw)

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

    ; GUI
    _GDIPlus_Startup()
    $hGUI = GUICreate('Malen ' & $sVersion, $iW, $iH + 50)
    $hDC = _WinAPI_GetDC($hGUI)
    $hIMG = _Image_Create($iW, $iH)
    $hBUF = DllStructGetData($hIMG, 1, 1)
    $hGFX = _GDIPlus_GraphicsCreateFromHDC($hBUF)
    $xIMG = _Image_Create($iW, $iH)
    $xDC = DllStructGetData($xIMG, 1, 1)
    $xGFX = _GDIPlus_GraphicsCreateFromHDC($xDC)
    $vCurBuf = _Image_Create($iW, $iH)
    $xDcCur = DllStructGetData($vCurBuf, 1, 1)
    $xGfxCur = _GDIPlus_GraphicsCreateFromHDC($xDcCur)
    $hPEN = _GDIPlus_PenCreate()
    $LinePen = _GDIPlus_PenCreate()
    $hBtnSave = GUICtrlCreateButton('Speichern', $iW - 75, 25, 75, 25)
    $hComboDicke = GUICtrlCreateCombo('1', 80, 2, 50, 23)
    $hComboCap = GUICtrlCreateCombo($aCaps[0], 222, 2, 73, 23)
    $hComboLen = GUICtrlCreateCombo('1', 177 + 75 + 135, 2, 50, 23)
    $hBtnExport = GUICtrlCreateButton('Export', $iW - 125, 25, 50, 25)
    $hBtnImport = GUICtrlCreateButton('Import', $iW - 175, 25, 50, 25)
    GUICtrlCreateLabel('Durchmesser:', 5, 5, 65, 17)
    GUICtrlCreateLabel('Linienenden:', 155, 5, 65, 17)
    GUICtrlCreateLabel('Schrittlänge:', 320, 5, 65, 17)
    $hBtnClear = GUICtrlCreateButton('Clear', 125, 25, 50, 25)
    $hBtnDel = GUICtrlCreateButton('Delete', 175, 25, 50, 25)
    $hBtnDel10 = GUICtrlCreateButton('Del 10', 225, 25, 50, 25)
    _GDIPlus_GraphicsSetSmoothingMode($xGFX, 4)
    _GDIPlus_GraphicsSetSmoothingMode($xGfxCur, 4)
    _FillPalette()

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

    ; Daten Laden
    For $i = 2 To 32 Step 1
    $sTMP &= Int($i) & '|'
    Next
    StringTrimRight($sTMP, 1)
    GUICtrlSetData($hComboDicke, $sTMP, '5')
    StringTrimRight($sTMP, 1)
    GUICtrlSetData($hComboLen, $sTMP, '10')
    GUICtrlSetData($hComboCap, $aCaps[1] & '|' & $aCaps[2])
    $hPicker = _GUIColorPicker_Create('Farbe', 75, 25, 50, 25, 0, BitOR($CP_FLAG_DEFAULT, $CP_FLAG_CHOOSERBUTTON), $aPalette, 'Farbauswahl', 8, 8)
    GUICtrlSetOnEvent($hPicker, 'EVENT')
    $hPicker2 = _GUIColorPicker_Create('Hintergrund', 0, 25, 75, 25, 0, BitOR($CP_FLAG_DEFAULT, $CP_FLAG_CHOOSERBUTTON), $aPalette, 'Farbauswahl', 8, 8)
    GUICtrlSetOnEvent($hPicker2, 'EVENT')
    GUICtrlSetTip($hBtnSave, 'Als Png speichern...')
    GUICtrlSetTip($hPicker2, 'Hintergrundfarbe...')
    GUICtrlSetTip($hPicker, 'Linienfarbe...')
    GUICtrlSetTip($hComboCap, 'Linientyp...')
    GUICtrlSetTip($hComboDicke, 'Durchmesser...')
    GUICtrlSetTip($hComboLen, 'Kleinste Linienlänge...')

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

    ; Vorbereiten
    _Repaint()
    GUICtrlSetOnEvent($hBtnClear, 'EVENT')
    GUICtrlSetOnEvent($hBtnExport, 'EVENT')
    GUICtrlSetOnEvent($hBtnImport, 'EVENT')
    GUICtrlSetOnEvent($hComboLen, 'EVENT')
    GUICtrlSetOnEvent($hComboCap, 'EVENT')
    GUICtrlSetOnEvent($hComboDicke, 'EVENT')
    GUICtrlSetOnEvent($hBtnSave, 'EVENT')
    GUICtrlSetOnEvent($hBtnDel, 'EVENT')
    GUICtrlSetOnEvent($hBtnDel10, 'EVENT')
    GUISetOnEvent(-3, 'EVENT', $hGUI)
    GUISetOnEvent(-5, 'EVENT', $hGUI)
    GUIRegisterMsg(0xF, 'WM_PAINT')
    OnAutoItExitRegister('_Frei')
    GUISetState(@SW_SHOW, $hGUI)

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

    While Sleep(30)
    $aPos = MouseGetPos()
    $aPos[1] -= 50
    If _Check($aPos) Then ; Maus ist im Fenster und Wurde bewegt
    If _IsPressed('01') Then ; Klick im Fenster
    If $aDown[0] = -1 Then ; aDown ist noch nicht gesetzt
    $aDown[0] = $aPos[0]
    $aDown[1] = $aPos[1]
    Else ; aDown ist gesetzt. Check ob Maxlen erreicht wurde
    If _CalcDif($aPos, $aDown) >= $iMaxLen Then ; Maxlen erreicht
    _AddLine($aPos, $aDown, $iCol, $iWidth, $iEnd)
    $aDown[0] = $aPos[0]
    $aDown[1] = $aPos[1]
    _Repaint(True)
    EndIf
    EndIf
    Else
    $aDown[0] = -1
    $aDown[1] = -1
    _DrawCur(1)
    EndIf
    EndIf
    WEnd

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

    Func _Comp($s)
    Local $aSplit = StringSplit($s, '|', 2)
    If @error And Not (StringLen($s) = 8) And Not StringIsXDigit($s) Then Return Tip('Export ungültig')
    Local $sRet = $aSplit[0], $aTmp, $Tmpx = 0, $Tmpy = 0
    For $i = 1 To UBound($aSplit) - 1 Step 1
    $aTmp = StringSplit($aSplit[$i], ',', 2)
    $sRet &= _DecTo32($aTmp[0] - $Tmpx + 512) ; Koord x1
    $sRet &= _DecTo32($aTmp[1] - $Tmpy + 512) ; Koord y1
    $sRet &= _DecTo32($aTmp[2] - $aTmp[0] + 512) ; Koord x2 - x1 + 512
    $sRet &= _DecTo32($aTmp[3] - $aTmp[1] + 512) ; Koord y2 - y1 + 512
    $sRet &= $aTmp[4] ; Farbe
    $sRet &= _DecTo32($aTmp[5] - 1, 1) ; Durchmesser
    $sRet &= ($aTmp[6] = 3) * 1
    $Tmpx = $aTmp[2]
    $Tmpy = $aTmp[3]
    Next
    ;~ ConsoleWrite($sRet & @CRLF)
    Return _Ersetzung_Comp($sRet)
    EndFunc ;==>_Comp

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

    Func _DeComp($s)
    Local $sDec = _Ersetzung_DeComp($s)
    Local $sTMP, $sRet, $x1, $y1, $x2, $y2, $Tmpx = 0, $Tmpy = 0
    $sTMP = StringLeft($sDec, 2)
    ;~ If Not StringIsXDigit($sTMP) Then Return Tip('Import ungültig')
    $sRet = '0x' & $sTMP & '|'
    For $i = 3 To StringLen($sDec) Step 12
    $sTMP = StringMid($sDec, $i, 16)
    $x1 = _32ToDec(StringMid($sTMP, 1, 2)) + $Tmpx - 512
    $y1 = _32ToDec(StringMid($sTMP, 3, 2)) + $Tmpy - 512
    $x2 = _32ToDec(StringMid($sTMP, 5, 2)) + $x1 - 512
    $y2 = _32ToDec(StringMid($sTMP, 7, 2)) + $y1 - 512
    $sRet &= $x1 & ',' & $y1 & ',' & $x2 & ',' & $y2 & ','
    $sRet &= StringMid($sTMP, 9, 2) & ','
    $sRet &= _32ToDec(StringMid($sTMP, 11, 1)) + 1 & ',' & StringRight($sTMP, 1) + 2 & '|'
    $Tmpx = $x2
    $Tmpy = $y2
    Next
    Return StringTrimRight($sRet, 1)
    EndFunc ;==>_DeComp

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

    Func _32ToDec($s32)
    Local Static $a = StringSplit('abcdefghijklmnopqrstuvwxyzäöüÄÖÜ', '', 2)
    Local $iRet, $sTMP, $l = StringLen($s32)
    For $i = 1 To $l Step 1
    $sTMP = StringMid($s32, $l - $i + 1, 1)
    For $x = 0 To 31 Step 1
    If $a[$x] == $sTMP Then
    $iRet += 32 ^ ($i - 1) * $x
    ExitLoop
    EndIf
    Next
    Next
    Return $iRet
    EndFunc ;==>_32ToDec

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

    Func _DecTo32($iDec, $iStellen = 2)
    Local Static $a = StringSplit('abcdefghijklmnopqrstuvwxyzäöüÄÖÜ', '', 2)
    Local $sRet
    Do
    $sRet = $a[Mod($iDec, 32)] & $sRet
    $iDec = Int($iDec / 32)
    Until $iDec = 0
    Return StringRight('aaa' & $sRet, $iStellen)
    EndFunc ;==>_DecTo32

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

    Func _Clear()
    ReDim $aLines[1][UBound($aLines, 2)]
    EndFunc ;==>_Clear

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

    Func _Export()
    Local $sExport = Hex($iBkCol, 2) & '|'
    For $i = 1 To UBound($aLines) - 1 Step 1
    For $x = 0 To UBound($aLines, 2) - 1 Step 1
    $sExport &= $aLines[$i][$x] & ','
    Next
    $sExport = StringTrimRight($sExport, 1) & '|'
    Next
    $sExport = StringTrimRight($sExport, 1)
    Tip('wird komprimiert...')
    ;~ ConsoleWrite($sExport & @CRLF)
    Local $c = _Comp($sExport)
    ClipPut($c)
    Tip('Fertig (' & Round(StringLen($c) / StringLen($sExport), 2) * 100 & '%) - [' & StringLen($c) & ']')
    EndFunc ;==>_Export

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

    Func _Import()
    Local $Dec = _DeComp(ClipGet())
    ;~ ConsoleWrite($Dec & @CRLF)
    Local $Split = StringSplit($Dec, '|', 2)
    ;~ If @error And Not (StringLen($Dec) = 8) And Not StringIsXDigit($Dec) Then Return Tip('Import ungültig')
    Local $u = UBound($aLines, 2)
    ReDim $aLines[1][$u]
    $iBkCol = $Split[0]
    ;~ ConsoleWrite($iBkCol & @CRLF)
    _Repaint()
    Local $a[2], $b[2]
    For $i = 1 To UBound($Split) - 1 Step 1
    Tip(UBound($aLines))
    $sTMP = StringSplit($Split[$i], ',', 2)
    If Not (UBound($sTMP) = $u) Then Return Tip('Import Error')
    $a[0] = $sTMP[0]
    $a[1] = $sTMP[1]
    $b[0] = $sTMP[2]
    $b[1] = $sTMP[3]
    _AddLine($a, $b, '0x' & $sTMP[4], Int($sTMP[5]), Int($sTMP[6]))
    Sleep(10)
    _Repaint(True)
    Next
    WM_PAINT()
    EndFunc ;==>_Import

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

    Func _FillPalette()
    For $r = 0 To 3 Step 1
    For $g = 0 To 3 Step 1
    For $b = 0 To 3 Step 1
    $aPalette[$r + $g * 4 + $b * 16] = '0x' & Hex(Int(82 * $r), 2) & Hex(Int(82 * $g), 2) & Hex(Int(82 * $b), 2)
    Next
    Next
    Next
    _SwapRow($aPalette, 1, 2, 8)
    _SwapRow($aPalette, 5, 6, 8)
    _SwapRow($aPalette, 2, 4, 8)
    _SwapRow($aPalette, 3, 5, 8)
    EndFunc ;==>_FillPalette

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

    Func Tip($s)
    ToolTip($s)
    AdlibRegister('EndTip', 1500)
    EndFunc ;==>Tip

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

    Func EndTip()
    ToolTip('')
    AdlibUnRegister('EndTip')
    EndFunc ;==>EndTip

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

    Func _Repaint($bOnlyLastLine = False)
    If $bOnlyLastLine Then
    Local $i = UBound($aLines) - 1
    _GDIPlus_PenSetColor($hPEN, '0xFF' & StringRight($aPalette['0x' & $aLines[$i][4]], 6))
    _GDIPlus_PenSetWidth($hPEN, $aLines[$i][5])
    DllCall($ghGDIPDll, "int", "GdipSetPenEndCap", "handle", $hPEN, "int", $aLines[$i][6])
    DllCall($ghGDIPDll, "int", "GdipSetPenStartCap", "handle", $hPEN, "int", $aLines[$i][6])
    _GDIPlus_GraphicsDrawLine($xGFX, $aLines[$i][0], $aLines[$i][1], $aLines[$i][2], $aLines[$i][3], $hPEN)
    Else
    _GDIPlus_GraphicsClear($xGFX, '0xFF' & StringRight($aPalette[$iBkCol], 6))
    For $i = 1 To UBound($aLines) - 1 Step 1
    _GDIPlus_PenSetColor($hPEN, '0xFF' & StringRight($aPalette['0x' & $aLines[$i][4]], 6))
    _GDIPlus_PenSetWidth($hPEN, $aLines[$i][5])
    DllCall($ghGDIPDll, "int", "GdipSetPenEndCap", "handle", $hPEN, "int", $aLines[$i][6])
    DllCall($ghGDIPDll, "int", "GdipSetPenStartCap", "handle", $hPEN, "int", $aLines[$i][6])
    _GDIPlus_GraphicsDrawLine($xGFX, $aLines[$i][0], $aLines[$i][1], $aLines[$i][2], $aLines[$i][3], $hPEN)
    Next
    EndIf
    _WinAPI_BitBlt($hBUF, 0, 0, $iW, $iH, $xDC, 0, 0, 0xCC0020)
    _DrawCur()
    WM_PAINT()
    EndFunc ;==>_Repaint

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

    Func _AddLine($p1, $p2, $iCol, $iWidth, $iEnd)
    Local $u = UBound($aLines)
    ReDim $aLines[$u + 1][UBound($aLines, 2)]
    $aLines[$u][0] = $p1[0]
    $aLines[$u][1] = $p1[1]
    $aLines[$u][2] = $p2[0]
    $aLines[$u][3] = $p2[1]
    $aLines[$u][4] = Hex(Int($iCol), 2)
    $aLines[$u][5] = $iWidth
    $aLines[$u][6] = $iEnd
    ;~ _ArrayDisplay($aLines)
    EndFunc ;==>_AddLine

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

    Func _CalcDif($a, $b)
    Return (($b[0] - $a[0]) ^ 2 + ($b[1] - $a[1]) ^ 2) ^ 0.5
    EndFunc ;==>_CalcDif

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

    Func _Check($aPos)
    Local Static $aPosAlt[2]
    If ($aPosAlt[0] <> $aPos[0] Or $aPosAlt[1] <> $aPos[1]) And ($aPos[0] >= 0 And $aPos[0] <= $iW And $aPos[1] >= 0 And $aPos[1] <= $iH) Then
    $aPosAlt[0] = $aPos[0]
    $aPosAlt[1] = $aPos[1]
    Return True
    EndIf
    Return False
    EndFunc ;==>_Check

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

    Func _FindInPalette($iCol)
    For $i = 0 To UBound($aPalette) - 1 Step 1
    If $iCol = $aPalette[$i] Then Return $i
    Next
    EndFunc ;==>_FindInPalette

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

    Func EVENT()
    Switch @GUI_CtrlId
    Case -3
    Exit
    Case $hPicker
    $iCol = _FindInPalette('0x' & StringTrimLeft(_GUIColorPicker_GetColor($hPicker), 2))
    $aDown[0] = -1
    $aDown[1] = -1
    Case $hPicker2
    $iBkCol = _FindInPalette('0x' & StringTrimLeft(_GUIColorPicker_GetColor($hPicker2), 2))
    $aDown[0] = -1
    $aDown[1] = -1
    _Repaint()
    Case $hBtnSave
    _Image_Save($hIMG)
    Case -5
    WM_PAINT()
    Case $hComboDicke
    $iWidth = GUICtrlRead($hComboDicke)
    Case $hComboCap
    $sTMP = GUICtrlRead($hComboCap)
    For $i = 0 To 1 Step 1
    If $sTMP = $aCaps[$i] Then
    $iEnd = $aCapsI[$i]
    ExitLoop
    EndIf
    Next
    Case $hComboLen
    $iMaxLen = GUICtrlRead($hComboLen)
    Case $hBtnExport
    _Export()
    Case $hBtnImport
    _Import()
    Case $hBtnClear
    _Clear()
    _Repaint()
    Case $hBtnDel
    If UBound($aLines) > 1 Then
    ReDim $aLines[UBound($aLines) - 1][UBound($aLines, 2)]
    _Repaint()
    EndIf
    Case $hBtnDel10
    For $i = 0 To 9 Step 1
    If UBound($aLines) > 1 Then
    ReDim $aLines[UBound($aLines) - 1][UBound($aLines, 2)]
    EndIf
    Next
    _Repaint()
    EndSwitch
    EndFunc ;==>EVENT

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

    Func _DrawCur($Paint = False)
    _WinAPI_BitBlt($xDcCur, 0, 0, $iW, $iH, $hBUF, 0, 0, 0xCC0020)
    If $Paint Then
    $sTMP = Ceiling($iWidth / 10)
    _GDIPlus_GraphicsDrawEllipse($xGfxCur, $aPos[0] - $iWidth / 2, $aPos[1] - $iWidth / 2, $iWidth, $iWidth, $LinePen)
    WM_PAINT()
    EndIf
    EndFunc ;==>_DrawCur

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

    Func WM_PAINT()
    DllCall('GDI32.dll', 'int', 'StretchBlt', 'hwnd', $hDC, 'int', 0, 'int', 50, 'int', $iW, 'int', $iH, 'hwnd', $xDcCur, 'int', 0, 'int', 0, 'int', $iW, 'int', $iH, 'dword', 0xCC0020)
    EndFunc ;==>WM_PAINT

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

    Func _Frei()
    _GUIColorPicker_Delete($hPicker)
    _GDIPlus_PenDispose($hPEN)
    _GDIPlus_GraphicsDispose($xGFX)
    _GDIPlus_GraphicsDispose($hGFX)
    _Image_Delete($hIMG)
    _Image_Delete($xIMG)
    _WinAPI_ReleaseDC($hGUI, $hDC)
    _GDIPlus_Shutdown()
    EndFunc ;==>_Frei

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

    Func _Image_Create($iW, $iH)
    Local $Ptr, $hDC, $hBmp, $tBMI, $aDIB, $vStruct
    $hDC = _WinAPI_CreateCompatibleDC(0)
    $tBMI = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4)
    DllStructSetData($tBMI, "Width", $iW)
    DllStructSetData($tBMI, "Height", -$iH)
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32)
    $aDIB = DllCall('GDI32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hBmp = $aDIB[0]
    $Ptr = $aDIB[4]
    _WinAPI_SelectObject($hDC, $hBmp)
    $vStruct = DllStructCreate('int[5]')
    DllStructSetData($vStruct, 1, $hDC, 1)
    DllStructSetData($vStruct, 1, $iW, 2)
    DllStructSetData($vStruct, 1, $iH, 3)
    DllStructSetData($vStruct, 1, $Ptr, 4)
    DllStructSetData($vStruct, 1, $hBmp, 5)
    Return $vStruct
    EndFunc ;==>_Image_Create

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

    Func _Image_Delete(ByRef $vStruct)
    _WinAPI_DeleteObject(DllStructGetData($vStruct, 1, 5))
    _WinAPI_DeleteDC(DllStructGetData($vStruct, 1, 1))
    $vStruct = 0
    EndFunc ;==>_Image_Delete

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

    Func _Image_Save($vImg)
    Local $sPfad = FileSaveDialog('Ziel wählen...', @ScriptDir, '(*.png)')
    If Not (StringRight($sPfad, 4) = '.png') Then $sPfad &= '.png'
    Local $hBmp = _GDIPlus_BitmapCreateFromHBITMAP(DllStructGetData($vImg, 1, 5))
    _GDIPlus_ImageSaveToFile($hBmp, $sPfad)
    _GDIPlus_BitmapDispose($hBmp)
    EndFunc ;==>_Image_Save

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

    Func _SwapRow(ByRef $a1, $y1, $y2, $iLen)
    Local $iTMP
    For $x = 0 To $iLen - 1 Step 1
    $iTMP = $a1[$x + $y1 * $iLen]
    $a1[$x + $y1 * $iLen] = $a1[$x + $y2 * $iLen]
    $a1[$x + $y2 * $iLen] = $iTMP
    Next
    EndFunc ;==>_SwapRow

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

    ;~ '!"#%&,-/:;=@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_`abcdefghijklmnopqrstuvwxyz~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'

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

    Func _ZeichenArray($sDoNotUse = '', $Dec = False)
    Local $sZ
    ;~ If $Dec Then
    ;~ $sZ = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz€ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäçèéêëìíîïðñòóôõöùúûüýÿ'
    ;~ Else
    $sZ = '!"#%&,-/:;=@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_`abcdefghijklmnopqrstuvwxyz~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
    ;~ EndIf
    For $i = 1 To StringLen($sDoNotUse) Step 1
    $sZ = StringReplace($sZ, StringMid($sDoNotUse, $i, 1), '', 0, 1)
    Next
    Local $UBound = StringLen($sZ), $b[$UBound]
    For $i = 0 To $UBound - 1 Step 1
    $b[$i] = StringLeft($sZ, 1)
    $sZ = StringTrimLeft($sZ, 1)
    Next
    Return $b
    EndFunc ;==>_ZeichenArray

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

    Func _Ersetzung_DeComp($a)
    Local $aTmp = StringSplit($a, ' '), $sDoNotUse = $aTmp[$aTmp[0]]
    $a = StringTrimRight($a, StringLen($sDoNotUse) + 1)
    Local $n = Int('0x' & StringRight($a, 2)), $_____ZeichenReverse = _ZeichenArray($sDoNotUse, True), $st = ''
    $a = StringTrimRight($a, 2)
    _ArrayReverse2($_____ZeichenReverse, 0, $n - 1)
    For $i = 0 To $n - 1 Step 1
    $st = StringRight($a, 2)
    $a = StringTrimRight($a, 2)
    $a = StringReplace($a, $_____ZeichenReverse[$i], $st, 0, 1)
    Next
    Return $a
    EndFunc ;==>_Ersetzung_DeComp

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

    Func _Ersetzung_Comp($a)
    Local $sTMP = $a, $sDoNotUse
    While $sTMP
    ;ConsoleWrite(StringLeft($sTmp, 1) & @CRLF)
    $sDoNotUse &= StringLeft($sTMP, 1)
    $sTMP = StringReplace($sTMP, StringLeft($sTMP, 1), '', 0, 1)
    WEnd
    ;~ ConsoleWrite('!--- DoNotUse Zeichen: ' & $sDoNotUse & @CRLF)
    Local $l_alt = StringLen($a), $l_neu = 0, $st, $er, $n = 0, $_____Zeichen = _ZeichenArray($sDoNotUse), $_____Zeichenmenge = UBound($_____Zeichen)
    While 1
    $st = _Analyse($a) ; $st = Meist vorkommender String
    $a = StringReplace($a, $st, $_____Zeichen[$n], 0, 1)
    $a &= $st ; Und rechts an $a angehängt. $a = Urspringsstring
    $l_neu = StringLen($a) ; Neue Stringlänge
    $n += 1 ; Durchläufe
    If ($n = $_____Zeichenmenge Or $l_neu >= $l_alt) Then ;Nur Abbrechen, wenn tatsächlich nix geht. (nicht wenn der 8er nicht klappt...)
    ExitLoop
    EndIf
    $l_alt = $l_neu
    If IsInt($n / 5) Then Tip($n & '/' & $_____Zeichenmenge)
    WEnd
    Return $a & Hex($n, 2) & ' ' & $sDoNotUse ; Rückgabe ist der Komprimierte String und die Anzahl ersetzungen
    EndFunc ;==>_Ersetzung_Comp

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

    Func _Analyse($sData, $l = 2)
    Local $StringLaenge = StringLen($sData), $Top[2], $StringPart, $Replacements, $BenutzteStrings[256][256]
    For $i = 0 To $StringLaenge - ($l - 1) Step 1
    $StringPart = StringMid($sData, $i, $l)
    If Not $BenutzteStrings[Asc(StringLeft($StringPart, 1))][Asc(StringRight($StringPart, 1))]Then ; Damit keine Strings doppelt getestet werden...
    $BenutzteStrings[Asc(StringLeft($StringPart, 1))][Asc(StringRight($StringPart, 1))] = True
    StringReplace($sData, $StringPart, $StringPart, 0, 1)
    $Replacements = @extended
    If $Replacements >= $Top[0] Then
    $Top[0] = $Replacements
    $Top[1] = $StringPart
    EndIf
    EndIf
    Next
    Return $Top[1]
    EndFunc ;==>_Analyse

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

    Func _ArrayReverse2(ByRef $avArray, $iStart = 0, $iEnd = 0)
    Local $vTmp, $iUBound = UBound($avArray) - 1
    For $i = $iStart To Int(($iStart + $iEnd - 1) / 2)
    $vTmp = $avArray[$i]
    $avArray[$i] = $avArray[$iEnd]
    $avArray[$iEnd] = $vTmp
    $iEnd -= 1
    Next
    EndFunc ;==>_ArrayReverse2

    [/autoit]
    Beispiel (5KB)
    Code
    ½wÜsöSS‚mÕR€‚n¸_V‚k¡QC‚fL¢@‚aJŠK‚j_€~‚mÔ_W‚g/‡‡‚ipjQV‚j¸S€‚gWSJ‚cK¢@‚cHà‚fV‡Y‚m°NY‚sÓ€¡‚sµN†‚z°@P4!"ÓH•`gËKW`tÓ¡U`Ö_¤H`ä@ì`u"ì`y/¡:`üK¡1`äPWRÒªP€`yÁ¡_`öK•~Ò_YK`uRU/`vJP/ÒCW=`ÿ¸H`ÄKWNÒªPV`gþJS‚i¡´@4²Ö"‡H‚gH_:‚i=_@4²Ö~µN4²ÖP_J‚hKS@‚h:_=‚gR‡6‚p‡1P‚vš€L‚oZQK‚iZ‡L‚iRQH‚wìZ`cpg/Š`hpgKZ`rÑWR`Ö6Ñ=`ÜV•LÒSY~`rš†Y`m´6U‚vŠŠ6‚e1S@‚jPQV‚mªQN‚i6‡/‚h:Z"‚k@ZH4!wöojý`spjU‡ÒÕURÒWUC`ö6¤H`üQWY`x:UR`vWPC`uLP@Ò@W/`r_KP`l´LP`k´6P`pSU=`uQY~`t‡P~`n°=U‚ܵJU‚mŠš6‚aJš"‚f@ZH‚j:_H‚aR´L4²Ö@‡C‚g¡_V‚gчV‚fWS1‚j~QJ‚oU€R`e¸WQ`yªWCÒ†P1`r€~U`nÔL†`rÊU•Ò¢U6`x1W@`x6U1`v~PJ`uYPC`öL¸@`cLŠC‚e¡SV‚jªQN‚mLQ"‚nRV~‚lC_:4!lyrg€¢‘rpeRZ‘kÕŠQ‘f¤_N‘l@V~‘t¢JPžlµªWžÜ´¤†žg€Q"‘jHS@‘h~_N‘iU_C‘kLQ@‘e~°N‘gW€N‘Št€R‘mW_C‘aL´@M²ÖK‡J‘g@_K‘kZQL‘šrNU‘wÓJW‘xµCP‘äÊ@UžiÊYPžÄSÁ=ûlCpj/ûe:•"žzHW@žx=U:žr¤L‡žzpiÅQûcUª@žz/P@žwHW"žw/P:M!"LQJM²wLra:M²f/qö"M²z"_"‘kHQ@‘h=Š:‘g@Z=‘lRQ6‘kC_H‘zQKYžuŠªLžäQU6žÜJÁ"ûc"¡"žö/•:M!vknÖ€L‘üš6Pžv_¸/žö1PHžu@ìžxC•Kžu‡~YžrVìžtRY~žvQW=žz1•"žx/P:žw~WCžt¡ýžeÅ1Q‘v¸€R‘c¡µRM²Ä•SN‘Šp1Z‘ŠpSN‘aLÔ"‘d"Q"‘m:Q/‘jZSY‘n¢N†žwSpeKûrCÕ"ûo"ph"ûcNYLž¤tL•‘xµŠY‘dJ‡CM!vgsÄCQ®ŠpZR“²ÜWµC“²Ü~Z:®j6_:®j/Z"®fNšL®kŠNY®zqö@Ñ®Ärd:¸®Öra"ª®Üqä@UÃdqä6ªÃmˆPÃo°L†Ãs_W6ÃöVªKÃzJP@ÃÄLÅCÃÖYUJÃw•UVÃtpf†°Ãmpb6SÃcoÐrr®mom°1®b6S@®gHà®f1‡=®jQV~®ršNY®švQW®rµCP®ö´"P®ÜK@Š®Üú"‡“!"pi"Q“!"þ"_“Æg†¢HÂc@àÂj@QHÂoR€LÂu¢JUÂöÊ@PÂÜÓ"•­cË/W­gµ6P­h´=P­ošUL­yV•=­öK¡€­zUU1­uYYN­o¤KQ­gþH_­cúH¢­bpc"SÂÖpj:QÂv¤VNO²üHqöKO²z€_=ÂjSZPÂrqyJ¡­bËKU­n¢†L­tQU6­xKWV­sÁLZ­fpf@šÂpYš~Âh¢VP­bµPW­ÜnrH_O‹goÄKÓO‹foÜ"QOjˆpe"°¬Üpc@_¬Üþ"Q¬ÖÁ:Q·mÖsl‡_ßjrcË€ßjªqÖRßfWqÄCßzPQC¬lWZR¬j†_@·sysl´"ßq"Þ"ßs:°/¬Ð_"¬hHS@ßz6qä1ßx=Š"·tmsh‡WßÜÞÔ¤¬iËCY¬rÔQP¬jµSW¬iµZP·uaph:P¬x´RP¬uÞCѬxÞJP·rüúHŬÜri:Õ¬Ärf@¤¬Üqä"POjˆqy"¡·mlijVQ¬n¤QN¬nUVC¬pU€N·udukCPëIršQLëIjRSHëIg@àëIjLQNëIp¡R€ë™reoy"PëIfš:•ë™jwtxZKƒh€‡=ƒa=°NƒdUZCƒiYSJƒfK‡@ƒhHZ"ƒlRQ~ƒn¢VP³ohox€~ƒqS€LƒoRQHƒk~_€ƒg•‡CƒhYZJƒjR_UƒkµQU³rssmSKƒc€¢=³oÄN°=ƒb1àƒi†Z€ƒipiSšƒf•‡=³wiroÁC³reÁ¤ŠÝwoÄL´Ýoow†µÝu•WYÝyÊWW³tmsePNÝt•YRÝy=ª6³sšz¡JÝv•ýÝäNŪÝöʆLƒsrÄŠ"ƒÐŠ/³oÖKÔRƒcÅZ_ƒmphVSƒoÁVRƒiPŠ1³oÜ"°=ƒc__Y³nzoäZ€ƒeW¢J³oÖL¢:ƒd=_@ƒj"ZHƒmRVLƒrŠNYƒdkg¢~ƒcVS/ƒh"_:ƒg†‡NƒhÅZSƒjÁ_RƒhPS1ƒdJš~ƒk¢NP³nhC‡CƒfUSNƒgYS1ƒg1SLƒ¤sJW³ynsnQJƒkª_Zƒbp¤tNƒbK_HƒpQCY³tu‡¢"ƒb/‡:ƒj†VNƒnLQ"³ujlbÓ†³oÜZQ=³htvhš~¦aZš6ÀoöKÊV¦cþVS¦oÑVC¦r1N†Àn¸iZJ¦eZ¢ª¦kÞC•ÀslsvË=Àoä"S1¦f¤‡S¦nþCV¦r"QY¦sÊJWÀsösi‡¡¦aÊ°~¦aQ‡=¦cWšŠ¦k6NUÀuÄ"rkCÀnÜLÓ@ÀoöL‡CÀtdshQYÀoÖQqyH¦aL€R¦hª¢€¦h€€¤ÀtxsbQL¦hKŠZ¦l/NYÀtsrmVU¦h¢šL¦f/Z€¦fWšJ¦d_S¤Àmn‡š"Ž²Ü"¢"©f=Q1©lLZ1©k†ZC©eU¢N©aÅŠS©gÁZR©m•VN©iÁŠ‡©iÕVR©hÑšZ©h¸VN©n†Q:©fU¢V©bª‡N©iWQN©jPSJ©f†‡J©e~‡1Ž²ÜPÔRŽ²vWqyCŽ²mYÞJŽ²x6à©g=S1©gLS1©g~SJ©tqÜ=UŽ,dÞ"¸Ž,f€KVŽ,gÅHQŽ,iÅýŽ,uY•"ŽÆbNÁLŽÆc_¡LŽ,ÖR¤HŽÆc@Ñ"ŽÆb"ª"Ž!nÖWpiL¼cVP=Tv1U"Tz:¡/TäCW=TwNP=Tz1ª"¼aJ¸6TüNU/Tw1UHTuVY†TwZ•=TtZL†Tq_P6Tx€•6TöS¡YTäŠWLTxSU~Tw‡U~Tu_YKTsQYKTrZ†LTrSY~TpŠL†To‡†LTt‡U†—"€Z"’k6ZJ’dU°R¶ÖpšqV’b¤ŠR’i¡VR’k¡SR’l•€N’kU‡C’hYZJ’iYSC’lU€N’lLà¶Ü~´R¶z•ÔN’eUVC’k•S€’j•QC’cP´C’aY_J¶ÜYÊC¶ÄL‡@’m_N•Td´Y~TtZP6TuSPYTcš€~’oRQ"’tW1_’w1Rª’örg/pjTfrh=¤Tdre"Á—"qÖ"PTÄSú=¼eLýTs¡UCTÄ1ц¼cS¤KTüNWH¼g:pgH¼i@¡"¼f"pj"¼b"ìTy"¡"Tä"W"TöHª@Tü=•:TyHUHTx@W"Tw"ì’öLŠN¶uWqÄN—nzLrk"¶j/S:’i6Z:’b~´C’eU€N’g~°@¶ä@´/¶üCš=’aCš/’e1_H’hHS:’i"Z/To"ph:¼u6pf:¼öYpaR¼tLÅH¼dN¤KTäCìTu6PJTvKU@Td¤€Š’fp¤t:¶xKµ1¶qLqä1¶q†µC¶Ü•Z€’f¸šV’fWZ1’wqyHpfTcryHúTgrgKYTh=/_T‡Ü¡ÊTÖozpšsTxpfýTmÑKVTr†WHTzN•KTt‡LY’eRrжr†SN’j¸QZ¼cKouL—srŠoöY¼äŠÕLTÄŠ†YTuSW6TxRU=Tz€¡KTäÔW¡TyÓWY’q€Þ@¶fLqÜC¶yWVR—mtlvqÄšÉbpepc_ÉcúÞ¢ÉboÜúšÉeoxËËÛüoiÕËÉüryKraÉgoaHra¨ˆnÜ@rbÛÖnÖ@rbÛhRCoöÛtse€pbÛxrÜ@paÛÖsa@paÉölÖC°ÛrKQ•ÉuqyUWÛüÓŠU¨0ox†Q•ÉdË•WÉyow=°Éklb»Ûäuo=@&‹c=º&‹b=/@&‹d@¹&‹bÏ&‹v"êù†@CŒÖP@CŒÄ~éøL1JŒäK1@Œä/1@Œz/J@ø6@1‰Šs="‰gÚÎd%h1è÷J¹õCÙõRH6õN¹çC==çRH6æR»æC¹æR"Kæ€Ù«R@6ùowè‰gC/=÷R=6÷Q/L÷Z=Kç_H~÷°6U‰gÔ/†‰dŠH~æàL«‡"†G0nsÕ16Œü_@†ùàK«R«Ï«ÏŒwpf:"ø1ôŒüS@PŒÄ°:†ŒÖš"†ŒÖZ:=ŒÖV"L«Qó«Q"LŒzog1"ŒüJ@6ŒzQNLŒwQJ6ŒäN:/øR1KŒÄZ"L«Š"Y«Š"L«Z"Kù_@~ù_"K«_"~«Zó«N«NóG0sÄuüåç66:÷6Øõ6؉d=/@ç¹"ç"‰ÐõZ/YçŠ/Lõ€«Ï«þ/:õ6åæ6ØæKê«LêŒÖ6:@Œü=éŒÄ6ºøLJJ‰iR=Îd%g:=Îd%j1L/‰iJ//çJ//÷ôÎd#zY/1‰dKØæ6å«Kê«KåŒÖ=:@ø/1@øØ"Œüé/ŒüãÎd#ÖJ»ùNÚùN»«ò‰dôÎd%zVÍ–f»"–i/Kñk=Kði==ñg==ðfèÌeK/ñgL6J–hL=ñhL6J–jYKC–jP6C–h†=ÌiLKÌg~HJ–dK/ðg/6ðh/=ðh/6ðgèÌgK6ñiK6ÌlK~ñmKKÌhK/ñhKKÌk6KðkLKC–j†6Ìg†/C–dYHJ–f~6ÌfLHÌc†HC–b†ê…ˆ†"C…0kphÜ"N…ˆ†å…ˆU"V…ˆ¸"€…#ÜW@J…#ÜR"U…ˆš"K…0voxr1K¥öZ:L¥ÄQ@6¥Ä€:6¥üJ:"¥ö:1/¥öãâe#ÿÚ¥ÄN:=¥Öò„ˆÏ£eJè£gC/=£e1ͣУdôâe%e1¹£bÏ£lVͣУÐͣЄˆC»£bNÙ£cC¹£cJ¹£f:6"£hK=C£gL=@£fK/J£d~H1£eL=1£fK/:£d6Ø£c6Ø£f66:£eKê¥ü=J"¥ä6:J¥z~C1¥yL11¥üKº¥ÖL@J¥ÖLº¥Ö6º¥Ö6º¥Ä6é¥ü6é¥üL:J¥äLJ:¥äK:1¥öKㄈV¹œbC»ïN»ïòœbJ¹œbC»ïò¯ö1Cât#zº"¯öJ16¯öC:ât#üéâtˆ@Íœgó"œg"î:=/î1/ât%fô/œhN66îRÙœbN»ïòœÐÍïºât#ÖÍ1œeL61îKØœdè:œg=6@œg//@œb6@1¯wýJ¯tYJC¯z†11¯äKã¯ü@Ú¯ÖR@6¯ÿ:"¯Ö:ïÏœbJ¹œcCÙœeC=/œdÏœdN=6¯ÖCCât#u/R1¯wKã¯ä=1@¯üK@J¯ÄLé¯Ä6º¯Ü6åï6åœc/Íîô=œiNK=œhC//œgN66î€H6œcN¹œcCÙœcNÙîCèœeϯvpa1ÈIüJÚ¿ÿ:ÈIüã/¿ö11ÈIöéÈIÿÚ¿üJ1ÈIÜ:/È‹fÚ"±gÚÈ‹g:=È‹d1±c1/È‹fô/±eNH6±dC/È‹c1±d:="±f@/È‹eC/6±fJ="±eKHC±cPHC±c~رe6=:±fè:±e/ͱf»"¿ÜHJ@¿v6R1¿wKã¿ä/1"¿yKCC¿ä~º¿Ö6º¿Ü"›jˆNó›jˆ€ó±e€66±gN//±dJ¹¿ü/CJ¿äLº±gHNív"Cíy@1Îb#öºíöêíöºÎb#üºíöêíä/ã×ä/1íöå"ÇŠm¹§ˆR@KÇbV/6Çc€óÇbRÙÇbV"L§ˆV»ÇdR=6ÇdR»ÇcN/=ÇdNÙÇfN6=Çeò×r•:6…#ÖN…ˆÏ…#Ä11Îa#ÿ»…#ÿ1Îa#üJÚ…#Üò…0kyhÄK"Mk%h@/HMk%dÅÍ4k%ruoáÕbKY¾%i_==¾%fN/=¾%dC¹áwHC:áw6C:áäK@1áö~JJáäK:@¾%oV1JáxKN@áu=N:¾0Ü%a0p0q00!q!¸Öqc29pÄqbqd3Epü3803qf&dpÜj#qepöpä3Dqg2Fpwqkqhqn;,pvqjpuBtpxqlqm4,pzqi4-AIBe&apyqo0"G%qpj%G#35M-;-37Aept…%;!j0qq02X%"/M,p!psqr„%pq„#”#&b&fŽ-prGˆOIO,“-X#qs›‹!oA™quqw—oO™ppH/@:"=—r39½k›I”0pmO-“,pn!r§%Ÿ2¨%qvqz1–/"Ÿ0Jc:po`wqxqtpl§#H:H=@=¨#A‹qü·oS"¾#Ÿ31:":‰b‰e6/::"133P""לfXˆ@–:–C"61=‰c‰fŒöŒÜpdMÆ~VpkÄJ9D 39wÜsöqnE0pmlhijkfärbaeztugÖocxyvüdÄD72F85

    lg
    Mars

  • Du solltest vielleicht noch die Colorpicker UDF in deinem Post verlinken ;).
    Nettes kleines Programm. Auch der Code ist (meiner Meinung nach) recht übersichtlich und effizient gehalten. Somit könnte das durchaus zum lernen geeignet sein.
    Deine Export/Import Funktion ist eine super Idee :thumbup: . Hübsches Bild übrigens :D.

  • Vielen Dank
    Da lässt sich bestimmt was draus machen, mir hat dieser Kreis um den Mauszeiger gefehlt, wo man sieht wo man wie viel malt aber das sollte sich doch recht einfach einbauen lassen oder? ;)

    Das mit dem Exportieren ist echt ne interessante Idee...

    Mein Versuch:

    Spoiler anzeigen
    Code
    S|425O5öO4m5O6öO5m5O7öO6m5O8öO7m5k0öO8m6k3ök0m6úõk3m6k7õúm6k8õk7m6k9õk8m6u1õk9m6u3õu1m6u5õu3éu7õu5éu8èu7éy0èu8éy1èy0éy4èy1éy5èy4éy6èy5éy8èy6éÄ0èy8m6Ä2èÄ0m6Ä5õÄ2m6Ä6õÄ5m6IGõÄ6m5t3õIGm5t6öt3m5t8öt6m5d2öt8m5d4öd2m5d5öd4m5d6öd5m5d8öd6m5Ööd8m4ÖöÖm3Öf4Öm1Öf3Öm0Öf1Öe17Öf0Öe15ÖÁ7Öe14ÖÁ5Öe13ÖÁ4Öe11ÖÁ3Öe05d8Á1Öe01d8Ã5d8Y99d8Ã1d8Y97dl99d8Y96dl97d8Y95dl96d8Y93dx95d8Y89dx93ÖY85dx89ÖY83dx85ÖY81dx83ÖY75dx81Öô9wí75Öô7wÑ69w0ô6wÑ67w1ô5wó66w1ô4wç65w3ô3wÏ64w5ô2wl63w6ô1wx62w8ô0Îí61w9äÎÑ60Î0äÎ4ãÎ1âÎ4ãÎ4âÎ5ÝÎ4âÎ6ÝÎ5ëÎ7ÝÎ6ëÎ9áÎ7ëË0áÎ9ëË1áË0ëË2áË1ëË3áË2ëË5áË3ëË6áË5ëË7áË6ëË9áË7ëÈ0áË9âÈ1áÈ0âÈ2ÝÈ1âÈ3ÝÈ2âÈ4ÝÈ3âÈ5ÝÈ4âÈ6ÝÈ5âÈ8ÝÈ6âÈ9ÝÈ8âÊ0ÝÈ9äÊ1ÝÊ0äÊ3ãÊ1äÊ5ãÊ3äÊ6ãÊ5äÊ7ãÊ6äÊ9ãÊ7äÜ0ãÊ9äÜ2ãÜ0äÜ6ãÜ2äÜ7ãÜ6äÜ8ãÜ7äq1ãÜ8äq3ãq1äq5ãq3âq7ãq5âq8Ýq7âÐÝq8âÉÝÐô4ÉÝÉô9ÉH64ÉY71ÉH69ÉY72ÉH71ÉY81ÉH72ÉY86ÉH81ÉY90ÉH86ÉY94ÉH90ÉY98ÉH94Ée03ÉH98Ée08ÉÃ3Ée11ÉÃ8Ée14ÉÁ1Ée17ÉÁ4Ém3ÐÁ7Ém6Ðf3ÐéÐõÐm9ÐèÐe33Ðf9Ðe33ÉÔ3Ðe32g5Ô3Ée31g9Ô2g5m9J4Ô1g9m8Â1f9J4ér1f8Â1ér4èr1ér8èr4év3èr8év7èv3éÌ0èv7éÌ3èÌ0éÌ7èÌ3éÌ8èÌ7éc0èÌ8éc1èc0éc2èc1éùèc2m8ùèùeòc6f8ùeòc7Ô0c6m9c7Ô0c7m5c7f9c7e19c7öc7e17c7Á9c7e12c7Á7c7e05ñÁ2c7Y98ñÃ5ñY95cl98ñY86cl95ñY82cl86ñY78cl82ñY75cl78ñô6cl75ñô5cl66ñô3cl65ñô1cl63ñô0cl61ñâcl60ñëñÝñën0áñën7án0ëÀ1án7ëÀ7áÀ1ë€2áÀ7ëj4á€2il10áj4il17al10il26al17il36al26ëo2al36ëa1áo2iÇ62áa1iÇ66aÇ62iÇ74aÇ66iÇ77aÇ74il78aÇ77ix82al78ix87ax82ix92ax87ix96ax92äÃ1ax96äÃ6ãÃ1äÁ2ãÃ6äf1ãÁ2ô0f9ãf1äÔx60f9äz2ãÔ9äz4ãz2âz6ãz4âz8Ýz6âz9Ýz8âÕ0Ýz9âÕ2ÝÕ0âÕ3ÝÕ2Y49Õ4ÝÕ3Y35Õ5o9Õ4YòÕç35Õ5Y23ÕÏòÕ5Y16ÕÏ23Õ6Y12ÕÏ16Õ6Y07ÕÏ12Õ6Y02ÕÏ07Õ6h95ÕÏ02Õ6ê9Õ9j5Õ6ê9Õ8À9Õ9ê9z9À9Õ8à0Ô8À9z9à0f9€0Ô8à0Á7€0f9à0Ã8€0Á7àí94€0Ã8êx82€í94êx72Àx82êÇ61Àx72ê7a1ÀÇ61êÇ35À7a1êl21ÀÇ35êl15Àl21êl07Àl15ê9j6Àl07ê9j0À9j6ê9€6À9j0à0À6À9€6à0À3€0À6à1n3€0À3à1n2€1n3ê9n2€1n2ê5ÍÀ9n2ê1ÍÀ5ÿ66ÍÀ1ÿ61Ín6ÿ50ÍÍÿ45Íc0ÿ44ÍÌ5ÿ32ÍÌ4ÿ29Ív2ÿðÍr9ÿ22Ír4ÿ21Ír2ÿ20Ír1ÿ19Ír0ÿ18ÍÂ9ÿ18n0Â8ÿ18c0Â8n0h20Ì0Â8c0h22v0r0Ì0h23r0r2v0hðÂ1r3r0hðg9r4Â1hðg5r4g9hðg4r4g5h23g2r4g4h23Ér3g2h23Ðr3ÉhðÐr3Ðh27Ðr4ÐhòÐr7Ðh38Ðv0Ðh46Ðv8Ðh48ÐÌ6Ðh61ÐÌ8Ðh62ÐÍÐê6q8n2Ðê8q7À6q8ê9q8À8q7ê9q7À9q8ê9q5À9q7à0q3À9q5à2Ü8€0q3à2Ü2€2Ü8à3Ê7€2Ü2à3Ê4€3Ê7à3Ê1€3Ê4à3È6€3Ê1à3Ë5€3È6à3Î7€3Ë5à3w8€3Î7à3w2€3w8à4d4€3w2à7t3€4d4à8Ä9€7t3à9Ä5€8Ä9h93Ä0€9Ä5h97y4j3Ä0Y04u8j7y4Y08uÇ04u8Y09uç08u7Y17uí09u5YðkÇ17u0Y32kçðk7Y40kó32k5Y45k2o0k3Y47O9o5k2ëO4o7O9âO4áO4ô8O4ÝO4Y78OÒ68O4Y88OÒ78O4Y99OÆ88O4e03OÆ99O2e06O2Ã3O2e12O2Ã6O2e17O3Á2O2e18O3Á7O3m4O3Á8O3m5O3f4O3Y31ËÑ33Ë0MtKòËó31Ë1MtKòËÇòË3MtKòÈóòË7MtK29ÊíòÈ3MtK28Èx29Ê0MtK28ÈÆ28È9MtK12wx11w5Û2Îl12w9Û2ËÒ12Î8Û2Èó12Ë4Û1Êí12È3Û1ÊÑ11Ê0Ó9ÊÏ11Ê1Ó3Êí09Ê6WGÈÑ03Ê0p6ËóGÈ1p5Î9j6Ë3p4Î2j5Î9p4w9j4Î2p6w3j4w9p8d6j6w3p9d2j8d6Ó1t6j9d2Ó5Äx01t6Ó7ÄÏ05Ä9Ó8ÄÏ07Ä6Ó6ÄÏ08Ä6Ó2ÄÏ06Ä6p8tÑ02Ä6p8t2j8t1p9t4j8t2p9t9j9t4p8d3j9t9p7d8j8d3p7Öj7d8p4d4j7Öp4d2j4d4p4t9j4d2p5t8j4t9p9t2j5t8Ó3Ä5j9t2Ó9yx03Ä5Û7yÒ09y9Ú4yí17y4ì1ulðy0ì8uÏ31u8s5uç38u6Ù2u3o5u5Ù8u1a2u3ï5k9Ýu1W73kÇ65k9W76kÏ73k7W91kÏ76k6W98kÏ91k6ÅGkç98k6Å01k5VGk5ü2úÃ1k5ü3úÁ2úü6úÁ3úü6k6Á6úü4u7Á6k6ü4y5Á4u7ü4y9Á4y5ü4Ä4Á4y9ü4IGÁ4Ä4ü4t5Á4IGü4t6Á4t5ü4t9Á4t6ü2t9Á4t9Å06t9Á2t9Å02t9Ã6t9W90t9Ã2t9W82dÑ90t9W72dÑ82d1ï1dÆ72d1Ù1dÆ61d2s4d4a1d2ì7d7o4d4ì3wÆ37d7Ú9Îí33w2Ú4Îó29Î0Ú0wÒðÎ3Û8dÏ20w4Û7tÒ18d6Ú6ÄÒ17t4ì7yl26Ä4s8yó37y8ï0ul48y3ï7uÆ60u8W71kl67u2W71kÏ71k8ï8kÒ71k6ï4kÒ68úï1kÒ64úÙ7kÒ61úÙ4k6áúÙ0k8a4k6s4u0a0k8ì7u1o4u0ì3uÒ37u1ì0ul33u4Ú4yÒòu8Û6Äóðy4Ù0u3o8u3ï1u2a0u3ï9kl61u2W73kÇ69k8W77kÏ73k7W81kÒ77k6W86kÒ81úW91kÒ86úW93kÒ91úW97kÒ93úÅGkó97úÅ01y2Ã1y1Å01Ä6Ã1y2W99Ä3Ã1Ä6W95yÇ99Ä3W91ÄÒ95y7W82Äó91Ä4W85yó82Ä3W86yí85y3W84yí86y0W71yÇ84y0Ù5Äx71y7s0t7a5Ä9Ú9d2o0t7Ú8dó29d2ï6tÒ70t3Ù3dÆ66t4s7d8a3d2s3w4o7d8ì8wl43w4ì4Îl38w8Ú5ÈÏ34Î8Ú2ÜÇ25È6Ú2gx22Ü7Ú2CGH22g9Ú4rí22CGÚ3ÌÇðr0Ú2Àí23Ì7Ûl0Æ22À0Ûl1x1l02Ûl3Ò1l19Ûl3x1l34Ó1Èl01È6Ó1Êx01È8Ó1Üx01Ê9Ó1ÉH01Ü9Ó1Jç01ÉÓ1rç01J5Ó8ÍH01r5Ó6€Æ08ÍÓç0ó06€2ÓÒ1x0ç03Û8nó14Â9Ú2jó18n3Ú1Âl22j3Û7ql21Â8Û0ÜÏ17q8Û2gÆ10Ü6Û2Âç12g2ûË0îÎ6ûÈ2îË0p3Ê2îÈ2p3Ü3j3Ê2p3q3j3Ü3p3CGj3q3ûÂ9j3CGûv2îÂ9p3Ì4îv2p4ùj3Ì4p4c5j4ùp4n7j4c5p4À2j4n7p3€5j4À2p3j8j3€5pÆ12j3j8pÑðjÆ12pÑ25jÑðpÑ26jÑ25p1o4jÑ26ûa1j1o4pÆ62îa1pÆ74jÆ62pÆ84jÆ74pÆ95jÆ84ûÃ5jÆ95ûÁ4îÃ5ûf3îÁ4ûÔ2îf3ûÔ7îÔ2ûz0îÔ7ûz3îz0ûz4îz3ûz6îz4ûz7îz6p9z7îz7Ó4z7j9z7Û3zÏ04z7Ú1zÏ13z6ì0zç21z6ì4zçòz5s2zÏ34z5s6z6o2z6Ù1z6o6z6Ù3z6a1z6Ù3Ô9a3z6Ù2õa3Ô9Ù2Á4a2õÙ2Ã3a2Á4Ù2VGa2Ã3ÙÆ98a2VGÙÑ89aÆ98sl76aÑ89sÒ62ol76s3a2oÒ62s3o2o3a2só33o3o2s5a3o6ásç36o5a3sÏ27oç36sç1l4Ï27sç04oç18s5j1oç04s5À9o5j1s5n6o5À9s5c5o5n6s4c0o5c5s4c6o4c0s7n7o4c6s7À5o7n7s8€2o7À5s8€9o8€2s8j9o8€9sÇ09o8j9sÇ17oÇ09sÇ26oÇ17sÏ34oÇ26s6o4oÏ34s6a4o6o4sl62o6a4sl69ol62sx82ol69sÇ87ox82ìÑ8Ç3Ñ95ìÑ1x3Ñ87ì0jÆ3Ñ19Úl1ÇòîÚ5aÇ2l17ÚÆ9Ñ25áÛl9x2Æ91ÛÏ6Ò1l99Óx3ó1Ï64ÓÇ2Ò0x33Ó6aÑ0ÇðÓÆ7Ò06a1pÇ9ç0Æ74p7Ã9jÇ95Ó3f0j7Ã9Ó7ÔÆ03f0Û3ÔÆ07Ô2Ú0ÔÆ13Ô2Ú8ÔÆ20Ô2ì3ÔÆ28Ô2ì8ÔÑ33Ô2ì9fÑ38Ô1ì8ÃÆ39f1ì3Ãç38Ã2Ú2Ãx33Ã5Û4Ãx22Ã9Û3ÃÇ14Ã9ÛÆ9l13Ã7Û0ÃÆ1Æ98Û3ÁÑ10Ã2Ú2Ál13Á1Ú4fí22Á8Ú5fíðf0b82J2€4J2b73ý€2J2b67ýÀ3ýb58ýn7ýb49ýñýb36ýÌ9ýb34CGv6ýb33g9v4CGb33g8v3g9b33g7v3g8b36g7v3g7b43g7v6g7b57g6Ì3g7b63g6c7g6b64g6n3g6b69g7n4g6b77g8n9g7ûg8À7g8p6g8îg8Ó1g8j6g8Ó5gl01g8b84JÏ05g8b56Â2€4J6b49Â2c6Â2b43Â2Ì9Â2b37Â2Ì3Â2b32Â4v7Â2bòÂ8v2Â4bòr1v0Â8b31r5v0r1b31v2v1r5b29Ì0v1v2b27Ì7r9Ì0b26c1r7Ì7b26ùr6c1b29ùr6ùb45ùr9ùb69ùÌ5ùb86ùn9ùb88ù€6ùb75v7Ì4v7b75r2c2r2b50r8c2r9b45r8c0r8b44r5Ì5r8Ù1w4a1w2s6Î7a1w4s4Ë7o6Î7s1Èl44Ë7s1Ü3o1È8s1Ðo1Ü3s2J4o1Ðs0r3o2J4s0Ìl40r3s0À2o0Ì8s0€9o0À2s0j3o0€9Ù0Ë3a0Ë1Ù0Ê4a0Ë3Ù1Ü9a0Ê4s9g3a1Ü9s9Jl49g3Ù0v0o9J8s7w0o6w1ï3d2o7w0ï7tÇ63d2ï1wÆ67t7Ù5ÎÒ61w2W71JÑ67J2W90JÑ71ýÅGJÑ90ýÅ09ýVGýü6CGÃ9ýÅðCGÁ6CGÅ28g9f4CGÅòg9f8g9Å29J8Ô0g9Å26Â8f9J8Å26r9õÂ8Å26v9õr9Å25Ì6õv9Å25Ì9öÌ6Åðc1öÌ9ü6c0f4c1W99c0Á6c0W83cí99c0ï6cí83c0Ù3cí66c0ï4gx65g8ï7ÂÑ69Â0ï6ÂÒ67Â1W82Âç66Â4W73Âx82Â5ï4vÏ73Â9Ù5vÇ64v6Ù6v8a5v7W73v9a6v8W91vx73v9Å03vx91v9Å09v7Ã3v9ü2r2Ã9v7Å09Â4Á2r2W92Â8Ã9Â4W83rç92Â8W90vÆ83r5Å02rl90v2NCFF,2BBC|00,3,1C0E3DD,LMJ,5AAGPGQBRSO,T,4NKE2UKEÒ5NXC5I1UZV2I9UXY5C9,68He2CÏ4b9I8C2W4I0,7C3I29H,8V4C8C7V1C1V0,9NZ2H7HI5g0I6I4C4n1I36Hq91H4HW0V3V5d9W5W2W1I7a8h8a7i8a9i95Hf7m7h7i7WòHj2W624c8303HY6f6f5c4k4p2Å1J1Íh6A F0A|425,678391


    Ihr müsst kurz warten, blau auf blau sieht man leider nicht... ;)

    DFPWare