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
(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
#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>
Opt('GUIOnEventMode', 1)
Opt('MouseCoordMode', 2)
Global Const $iW = 550
Global Const $iH = 550
Global Const $sVersion = '24.04.13'
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
; Einstellbar
Global $iMaxLen = 5, $iCol = 0, $iWidth = 5, $iEnd = 2, $iBkCol = 63
; Lines:
; 0 - 3 - x1, y1, x2, y2
; 4 - Farbe (erstmal 32Bit)
; 5 - Dicke (1px, 2px ->)
; 6 - Enden (Rund, Eckig, usw)
; 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()
; 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,
GUICtrlSetOnEvent($hPicker, 'EVENT')
$hPicker2 = _GUIColorPicker_Create('Hintergrund', 0, 25, 75, 25, 0, BitOR($CP_FLAG_DEFAULT, $CP_FLAG_CHOOSERBUTTON), $aPalette, 'Farbauswahl', 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...')
; 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)
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
Func _Comp($s)
Local $aSplit = StringSplit($s, '|', 2)
If @error And Not (StringLen($s) = 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
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
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
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
Func _Clear()
ReDim $aLines[1][UBound($aLines, 2)]
EndFunc ;==>_Clear
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
Func _Import()
Local $Dec = _DeComp(ClipGet())
;~ ConsoleWrite($Dec & @CRLF)
Local $Split = StringSplit($Dec, '|', 2)
;~ If @error And Not (StringLen($Dec) = 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
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,
_SwapRow($aPalette, 5, 6,
_SwapRow($aPalette, 2, 4,
_SwapRow($aPalette, 3, 5,
EndFunc ;==>_FillPalette
Func Tip($s)
ToolTip($s)
AdlibRegister('EndTip', 1500)
EndFunc ;==>Tip
Func EndTip()
ToolTip('')
AdlibUnRegister('EndTip')
EndFunc ;==>EndTip
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
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
Func _CalcDif($a, $b)
Return (($b[0] - $a[0]) ^ 2 + ($b[1] - $a[1]) ^ 2) ^ 0.5
EndFunc ;==>_CalcDif
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
Func _FindInPalette($iCol)
For $i = 0 To UBound($aPalette) - 1 Step 1
If $iCol = $aPalette[$i] Then Return $i
Next
EndFunc ;==>_FindInPalette
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
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
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
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
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
Func _Image_Delete(ByRef $vStruct)
_WinAPI_DeleteObject(DllStructGetData($vStruct, 1, 5))
_WinAPI_DeleteDC(DllStructGetData($vStruct, 1, 1))
$vStruct = 0
EndFunc ;==>_Image_Delete
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
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
;~ '!"#%&,-/:;=@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
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
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
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
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
Beispiel (5KB)
½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Ë/Wgµ6Ph´=PošULyV•=öK¡€zUU1uYYNo¤KQgþH_cúH¢bpc"SÂÖpj:QÂv¤VNO²üHqöKO²z€_=ÂjSZPÂrqyJ¡bËKUn¢†LtQU6xKWVsÁLZfpf@šÂpYš~Âh¢VPbµ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