[Geschlossen/Lösung gefunden] Grafikpaket

  • Hallo, ich habe mir überlegt ein Paar bilder in ein Grafikpaket zu sammeln.
    Ich habe nur leider keine idee wie ich das machen könnte. Vll binär ?!
    Ich möchte Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Bilder in so ein paket Packen.
    Hat jmd ein Vorschlag?

  • 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