GDI+ ImageCrypt

  • Mit dieser UDF kann man Strings in Bildform umwandeln und selbstverständlich auch wieder zurück ;). Ein Schlüssel kann zufällig erstellt, in einer Datei abgespeichert oder aus einer Datei eingelesen werden.
    Alle Funktion sind beschrieben und ein Beispiel ist auch mit dabei.
    Und wieder wird die GDIP.au3 benötigt... :D
    Die GDIP.au3, die UDF und ein Beispiel befinden sich im Anhang.

    UDF:

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _ImageCrypt_GenerateImage
    ; Beschreibung ..: Erstellt eine Bitmap aus den angegebenen Daten und dem angegebenen Schlüssel. Benötigt: '#include <GDIP.au3>'
    ; Syntax ........: _ImageCrypt_GenerateImage($sData, $aColorKey, $iCryptImageSize, [$sFilePath = ""])
    ; Parameter .....: $sData - Die Daten die in die Bitmap geschrieben werden
    ; $aColorKey - Array das den Schlüssel enthält
    ; $iCryptImageSize - Höhe/Breite der Bitmap
    ; $sFilePath - [Optional] Speicherort der Bitmap (Wird ein leerer String "" angegeben, gibt die Funktion ein Bitmap Handle zurück
    ; Rückgabewerte .: Success - Gibt ein Bitmap Handle bzw. den Rückgabewert von _GDIPlus_ImageSaveToFile zurück
    ; Failure - -1 und setzt @error
    ; |@error = 1 - $sData ist ein leerer String
    ; |@error = 2 - $aColorKey ist kein Array
    ; |@error = 3 - Der Datenstrang ist zu groß für die Bitmap
    ; Bemerkungen ...: Benötigt _GDIPlus_Startup. Das Bild darf nicht verkleinert/vergrößert oder komprimiert werden, da es sonst nicht mehr korrekt entschlüsselt werden kann
    ; ===============================================================================================================================
    Func _ImageCrypt_GenerateImage($sData, $aColorKey, $iCryptImageSize, $sFilePath = "")
    If $sData = "" Then Return SetError(1, 0, -1)
    If Not IsArray($aColorKey) Then Return SetError(2, 0, -1)

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

    Local $aDataSplit = StringSplit($sData, "")
    If $aDataSplit[0] > $iCryptImageSize ^ 2 Then Return SetError(3, 0, -1)

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

    Local $hCryptGraphicsTmp = _GDIPlus_GraphicsCreateFromHWND(WinGetHandle(AutoItWinGetTitle()))
    Local $hCryptBitmapTmp = _GDIPlus_BitmapCreateFromGraphics($iCryptImageSize, $iCryptImageSize, $hCryptGraphicsTmp)
    Local $hBitmapGraphicsContextTmp = _GDIPlus_ImageGetGraphicsContext($hCryptBitmapTmp)

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

    _GDIPlus_GraphicsClear($hBitmapGraphicsContextTmp, 0xFFFFFFFF)

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

    Local $iJ = 0
    For $iY = 0 To $iCryptImageSize - 1
    For $iX = 0 To $iCryptImageSize - 1
    $iJ += 1
    For $iI = 1 To $aColorKey[0][0]
    If $iJ > $aDataSplit[0] Then ExitLoop 3
    If $aDataSplit[$iJ] == $aColorKey[$iI][0] Then
    _GDIPlus_BitmapSetPixel($hCryptBitmapTmp, $iX, $iY, "0xFF" & $aColorKey[$iI][1])
    ExitLoop
    EndIf
    Next
    Next
    Next

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

    _GDIPlus_GraphicsDispose($hCryptGraphicsTmp)
    _GDIPlus_GraphicsDispose($hBitmapGraphicsContextTmp)

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

    If $sFilePath <> "" Then
    Local $iReturn = _GDIPlus_ImageSaveToFile($hCryptBitmapTmp, $sFilePath)
    _GDIPlus_BitmapDispose($hCryptBitmapTmp)
    Return $iReturn
    EndIf
    Return $hCryptBitmapTmp
    EndFunc ;==>_ImageCrypt_GenerateImage

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _ImageCrypt_DecryptImage
    ; Beschreibung ..: Entschlüsselt ein Bild mit dem angegebenen Schlüssel. Benötigt: '#include <GDIP.au3>'
    ; Syntax ........: _ImageCrypt_DecryptImage($sImagePath, $aColorKey, [$iCryptImageSize = 0])
    ; Parameter .....: $sImagePath - Die Daten die in die Bitmap geschrieben werden
    ; $aColorKey - Array das den Schlüssel enthält
    ; $iCryptImageSize - [Optional] Höhe/Breite der Bitmap. Falls 0, so wird die Größe mit _GDIPlus_ImageGetWidth ausgelesen
    ; Rückgabewerte .: Success - Gibt den entschlüsselten Datenstrang zurück
    ; Failure - -1 und setzt @error
    ; |@error = 1 - $sImagePath ist ein leerer String
    ; |@error = 2 - $aColorKey ist kein Array
    ; Bemerkungen ...: Benötigt _GDIPlus_Startup.
    ; ===============================================================================================================================
    Func _ImageCrypt_DecryptImage($sImagePath, $aColorKey, $iCryptImageSize = 0)
    If $sImagePath = "" Then Return SetError(1, 0, -1)
    If Not IsArray($aColorKey) Then Return SetError(2, 0, -1)

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

    Local $hCryptBitmapTmp = _GDIPlus_BitmapCreateFromFile($sImagePath)
    If $iCryptImageSize <= 0 Then $iCryptImageSize = _GDIPlus_ImageGetWidth($hCryptBitmapTmp)

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

    Local $sReturnData = ""
    For $iY = 0 To $iCryptImageSize - 1
    For $iX = 0 To $iCryptImageSize - 1
    $iPixelColorTmp = StringTrimLeft(Hex(_GDIPlus_BitmapGetPixel($hCryptBitmapTmp, $iX, $iY)), 2)
    If $iPixelColorTmp = "FFFFFF" Then ExitLoop 2
    For $i = 1 To $aColorKey[0][0]
    If $iPixelColorTmp == $aColorKey[$i][1] Then
    $sReturnData &= $aColorKey[$i][0]
    ExitLoop
    EndIf
    Next
    Next
    Next

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

    _GDIPlus_BitmapDispose($hCryptBitmapTmp)

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

    Return $sReturnData
    EndFunc ;==>_ImageCrypt_DecryptImage

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _ImageCrypt_CreateRandomKey
    ; Beschreibung ..: Erstellt einen zufälligen Schlüssel für die spätere Verwendung
    ; Syntax ........: _ImageCrypt_CreateRandomKey()
    ; Parameter .....: Keine
    ; Rückgabewerte .: Success - Gibt den erstellten Schlüssel zurück
    ; Failure - ""
    ; Bemerkungen ...: Keine
    ; ===============================================================================================================================
    Func _ImageCrypt_CreateRandomKey()
    Local $aRandomKey[102][2]
    $aRandomKey[0][0] = 101
    For $i = 1 To 26
    $aRandomKey[$i][0] = Chr($i + 64)
    Next
    For $i = 27 To 52
    $aRandomKey[$i][0] = Chr($i + 70)
    Next
    For $i = 53 To 62
    $aRandomKey[$i][0] = Chr($i - 5)
    Next
    $aRandomKey[63][0] = " "
    $aRandomKey[64][0] = "?"
    $aRandomKey[65][0] = "!"
    $aRandomKey[66][0] = "."
    $aRandomKey[67][0] = ","
    $aRandomKey[68][0] = ";"
    $aRandomKey[69][0] = ":"
    $aRandomKey[70][0] = "("
    $aRandomKey[71][0] = ")"
    $aRandomKey[72][0] = '"'
    $aRandomKey[73][0] = "'"
    $aRandomKey[74][0] = "%"
    $aRandomKey[75][0] = "&"
    $aRandomKey[76][0] = "$"
    $aRandomKey[77][0] = "ß"
    $aRandomKey[78][0] = "="
    $aRandomKey[79][0] = "+"
    $aRandomKey[80][0] = "-"
    $aRandomKey[81][0] = "_"
    $aRandomKey[82][0] = "*"
    $aRandomKey[83][0] = "/"
    $aRandomKey[84][0] = "\"
    $aRandomKey[85][0] = "@"
    $aRandomKey[86][0] = "#"
    $aRandomKey[87][0] = "~"
    $aRandomKey[88][0] = "{"
    $aRandomKey[89][0] = "}"
    $aRandomKey[90][0] = "§"
    $aRandomKey[91][0] = "^"
    $aRandomKey[92][0] = "°"
    $aRandomKey[93][0] = "<"
    $aRandomKey[94][0] = ">"
    $aRandomKey[95][0] = "|"
    $aRandomKey[96][0] = "ä"
    $aRandomKey[97][0] = "ö"
    $aRandomKey[98][0] = "ü"
    $aRandomKey[99][0] = "Ä"
    $aRandomKey[100][0] = "Ö"
    $aRandomKey[101][0] = "Ü"
    For $i = 1 To 101
    Do
    $bUnique = True
    $aRandomKey[$i][1] = Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2)
    For $j = 1 To 101
    If $j <> $i And $aRandomKey[$j][1] = $aRandomKey[$i][1] Or $aRandomKey[$i][1] = "FFFFFF" Then $bUnique = False
    Next
    Until $bUnique
    Next
    Return $aRandomKey
    EndFunc ;==>_ImageCrypt_CreateRandomKey

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _ImageCrypt_SaveKeyToFile
    ; Beschreibung ..: Speichert einen Schlüssel in einer Datei
    ; Syntax ........: _ImageCrypt_SaveKeyToFile($aColorKey, $sFilePath)
    ; Parameter .....: $aColorKey - Der Schlüssel der gespeichert werden soll
    ; $sFilePath - Pfad zur Zieldatei
    ; Rückgabewerte .: Success - 1
    ; Failure - -1 und setzt @error
    ; |@error = 1 - $sFilePath ist ein leerer String
    ; |@error = 2 - $aColorKey ist kein Array
    ; Bemerkungen ...: Falls die Datei bereits existiert wird ihr Inhalt überschrieben
    ; ===============================================================================================================================
    Func _ImageCrypt_SaveKeyToFile($aColorKey, $sFilePath)
    If Not IsArray($aColorKey) Then Return SetError(2, 0, -1)
    If $sFilePath = "" Then Return SetError(1, 0, -1)

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

    $hCryptKeyFile = FileOpen($sFilePath, 2)
    If $hCryptKeyFile = -1 Then Return SetError(3, 0, -1)

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

    $sKeyTmp = ""
    For $iI = 1 To $aColorKey[0][0]
    $sKeyTmp &= $aColorKey[$iI][0] & "=" & $aColorKey[$iI][1] & ";"
    Next
    FileWrite($hCryptKeyFile, StringTrimRight($sKeyTmp, 1))
    FileClose($hCryptKeyFile)
    $sKeyTmp = ""

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

    Return 1
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _ImageCrypt_LoadKeyFromFile
    ; Beschreibung ..: Lädt einen Schlüssel aus einer Datei
    ; Syntax ........: _ImageCrypt_LoadKeyFromFile($sFilePath)
    ; Parameter .....: $sFilePath - Pfad zur Datei
    ; Rückgabewerte .: Success - Gibt den Schlüssel aus der Datei zurück
    ; Failure - -1 und setzt @error
    ; |@error = 1 - $sFilePath ist ein leerer String
    ; Bemerkungen ...: Keine
    ; ===============================================================================================================================
    Func _ImageCrypt_LoadKeyFromFile($sFilePath)
    If $sFilePath = "" Then Return SetError(1, 0, -1)

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

    $aKeySplitTmp = StringSplit(FileRead($sFilePath), ";")
    Local $aColorKey[$aKeySplitTmp[0] + 1][2]
    $aColorKey[0][0] = $aKeySplitTmp[0]

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

    For $i = 1 To $aColorKey[0][0]
    $aSplitTmp = StringSplit($aKeySplitTmp[$i], "=", 2)
    $aColorKey[$i][0] = $aSplitTmp[0]
    $aColorKey[$i][1] = $aSplitTmp[1]
    Next

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

    Return $aColorKey
    EndFunc

    [/autoit]


    Ich hoffe es hilft irgendjemandem bei... was auch immer... :D

    Und so sieht das nachher aus:

  • Ähm, meines Wissens nach kann man ein Bild einfach per FileRead auslesen und dann mit der passenden Endung per filewrite abspeichern...

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Zitat

    ich begreifs nich xD
    iwie macht es punkte xD


    Gut beobachtet...
    Es wandelt einen beliebigen String mit einem Schlüssel in ein Bild um und kann auch ein Bild mit diesem Schlüssel wieder in Stringform bringen.
    Was das bringt? Keine Ahnung, aber mir war langweilig :P.

  • Zitat

    bei mir kommt immer "ImageCrypt by name22 @autoit.de" raus, egal wie das bild ist


    Im Beispiel wird ein Schlüssel erstellt der jedem Zeichen eine Farbe zuordnet, danach wird das Bild erstellt das den String enthält. Wenn dann dieses gerade erstellte Bild mit dem Schlüssel ausgelesen wird mit dem es erzeugt wurde ist es kein Wunder, dass bei dir immer das selbe herauskommt... :rolleyes:

  • Kleine Anregung: Ich kenn much ja mit GDI+ nicht aus, aber geht das:
    1. das Bild wird generwiert
    2. Das Bild wird in einem anderen an einen beliebigen PLatz gesetzt (GUI)
    3. Es gibt einen speziellen Anfangscode (iwe bei QR), mitdem das Auslese-script den code wieder findet, ausschneidet und zurückverwandelt!
    mfg

    MfG. tobi_girst

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »tobi_girst« (Morgen, 25:63)

  • Ich hätte da auch noch eine Idee.

    Könnte man bei der Funktion _ImageCrypt_GenerateImage($sData, $aColorKey, $iCryptImageSize, [$sFilePath = ""]) den Parameter $iCryptImageSize nich auch als optional einstellen.

    Du könntest ja am anfang deiner Funktion errechnen wie gross deine Bitmap werden soll.

    [autoit]

    $sString = "Dies ist ein Test String"
    $iLenght = StringLen($sString)
    $iCount = 0
    $iSize = 0

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

    Do
    $iCount += 1
    $iSize = $iCount ^ 2
    Until $iSize >= $iLenght

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

    MsgBox(0, "Erfolg", "Das Feld muss die größe von " & $iCount & "^2 haben damit alle Chrs darin platz haben")

    [/autoit]

    Mfg
    monkey

    Monkey - die finale Potenz von göttlich!
    Sloganizer

  • Ja so könnte man es auch machen, ist wahrscheinlich effektiver. :D

    Zitat

    Kleine Anregung: Ich kenn much ja mit GDI+ nicht aus, aber geht das:
    1. das Bild wird generwiert
    2. Das Bild wird in einem anderen an einen beliebigen PLatz gesetzt (GUI)
    3. Es gibt einen speziellen Anfangscode (iwe bei QR), mitdem das Auslese-script den code wieder findet, ausschneidet und zurückverwandelt!
    mfg


    Ich weiß nicht ob das so einfach ist, aber cool ist es auf jeden Fall. Praktisch ein QR Code Klon (nur etwas einfacher). :thumbup: