[Geschlossen/Lösung gefunden] Grafikpaket

  • Das einfachste?
    Alle Dateien binär öffnen und den Inhalt hintereinander in eine neue Datei schreiben. Alternativ Zippen....

  • Und wie geht das dann mit dem einbinden der bilder?
    öffnen ist ja

    [autoit]

    FileOpen ( "filename" ,16] )

    [/autoit]


    und schreiben

    [autoit]

    Filewrite()

    [/autoit]
  • [autoit]

    #include <File.au3>
    #include <Array.au3>

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

    ; packt alle Dateien in einem Verzeichnis in eine Containerdatei
    ;Dateiformat des Containers:
    ;4 Byte Anzahl Dateien, eigentlich nicht nötig
    ;xx Byte Name 1. Datei, nullterminiert, damit man weiss, wann der Dateiname zuende ist
    ;8 Byte Größe 1. Datei
    ;xx Byte Dateiinhalt 1. Datei
    ;xx Byte Name 2. Datei, nullterminiert
    ;8 Byte Größe 2. Datei
    ;xx Byte Dateiinhalt 2. Datei
    ;uswusf

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

    ;Beispiel: alle Dateien im Verzeichnis @scriptdir\pics in eine ContainerDatei schreiben

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

    $aFilelist = _FileListToArray(@ScriptDir & "\pics", "*", 1) ;nur Dateien anzeigen, Filter ggf anpassen
    _ArrayDisplay($aFilelist)

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

    $hContainer = FileOpen("container.dat", 18) ;Containerdatei öffnen im binärmodus und ehemalige Datei löschen
    FileWrite($hContainer, Hex($aFilelist[0], 4));Anzahl Dateien in den Container schreiben

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

    For $i = 1 To $aFilelist[0] ;alle Dateien im Verzeichnis
    $dateiinhalt = FileRead(@ScriptDir & "\pics\" & $aFilelist[$i]) ;Dateiinhalt im Verzeichnis einlesen
    $dateigroesse = @extended ;Dateigrösse ermitteln
    FileWrite($hContainer, $aFilelist[$i] & Chr(0)) ;Dateiname schreiben, nullterminiert
    FileWrite($hContainer, Hex($dateigroesse, 8)) ;Dateigröße schreiben
    FileWrite($hContainer, $dateiinhalt) ;Dateiinhalt schreiben
    Next

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

    ShellExecuteWait("scite.exe", "container.dat") ;dateiinhalt anzeigen in scite
    ;nun sind alle Dateien fertig verpackt in der Container-Datei

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

    MsgBox(0, 0, "Dateien sind im Container. Nun Dateien wieder auspacken und in Verzeichnis \pics2 schreiben...")
    ;alle wieder auspacken in das Verzeichnis \pics2

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

    If Not FileExists(@ScriptDir & "\pics2\") Then DirCreate(@ScriptDir & "\pics2") ;wenn Verzeichnis nicht existent, dann erstellen

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

    $hContainer = FileOpen("container.dat", 16) ;Containerdatei binär öffnen
    $dateiinhalt = BinaryToString(FileRead($hContainer)) ;dateiinhalt binär einlesen
    ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Dateiinhalt = ' & $dateiinhalt & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $anzahl_dateien = Dec(StringLeft($dateiinhalt, 4)) ;die ersten 4 byte sind die Anzahl der im Container enthaltenen Dateien
    ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $anzahl_dateien = ' & $anzahl_dateien & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

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

    $position = 5 ;aktuelle Position eines Zeigers auf die Daten im Container, der Zeiger zeigt auf das 5. Byte in der Containerdatei, also auf das erste Byte des Namens der 1. png-Datei

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

    For $i = 1 To $anzahl_dateien ;alle Dateien im Container auspacken
    ;name der Datei im Container extrahieren
    $pos_nullbyte = StringInStr($dateiinhalt, Chr(0), 1, 1, $position) ;nächstes nullbyte finden, dazwischen steht der Name der Datei
    ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $pos_nullbyte = ' & $pos_nullbyte & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $Dateiname = StringMid($dateiinhalt, $position, $pos_nullbyte - $position) ;Dateinamen auslesen
    ;MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @LF & '$Dateiname' & @LF & @LF & 'Return:' & @LF & $Dateiname) ;### Debug MSGBOX
    $dateilaenge = Dec(StringMid($dateiinhalt, $pos_nullbyte + 1, 8)) ;Dateilänge extrahieren
    ;MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @LF & 'stringmid($Dateiinhalt,$pos_nullbyte+1,$pos_nullbyte+9)' & @LF & @LF & 'Return:' & @LF & StringMid($dateiinhalt, $pos_nullbyte + 1, $pos_nullbyte + 9)) ;### Debug MSGBOX
    ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $dateilaenge = ' & $dateilaenge & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $position = $pos_nullbyte + 9 ;zeiger auf die Position des ersten Bytes des Dateiinhaltes
    $file = StringMid($dateiinhalt, $position, $dateilaenge) ;dateiinhalt auslesen
    FileWrite(@ScriptDir & "\pics2\" & $Dateiname, $file) ;und in Datei schreiben oder alternativ direkt in den Speicher
    $position += $dateilaenge ;zeiger auf erstes Byte des nächsten Dateinamens setzen
    Next

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

    $aFilelist = _FileListToArray(@ScriptDir & "\pics2\", "*", 1) ;nur Dateien anzeigen, Filter ggf anpassen
    _ArrayDisplay($aFilelist)

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

    ;das extrahieren der Dateiinhalte im Container geht bestimmt auch mit einer Zeile mittels regexp^^

    [/autoit]


    man kann noch reichlich kürzen, aber so ist es etwas verständlicher imho