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
Hat jmd ein Vorschlag?
[Geschlossen/Lösung gefunden] Grafikpaket
-
JuraX -
6. Juni 2010 um 10:10
-
-
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?
[autoit]
öffnen ist jaFileOpen ( "filename" ,16] )
[/autoit]
[autoit]
und schreibenFilewrite()
[/autoit] -
[autoit]
#include <File.au3>
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
#include <Array.au3>; packt alle Dateien in einem Verzeichnis in eine Containerdatei
[/autoit][autoit][/autoit][autoit]
;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;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
[/autoit][autoit][/autoit][autoit]
_ArrayDisplay($aFilelist)$hContainer = FileOpen("container.dat", 18) ;Containerdatei öffnen im binärmodus und ehemalige Datei löschen
[/autoit][autoit][/autoit][autoit]
FileWrite($hContainer, Hex($aFilelist[0], 4));Anzahl Dateien in den Container schreibenFor $i = 1 To $aFilelist[0] ;alle Dateien im Verzeichnis
[/autoit][autoit][/autoit][autoit]
$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
NextShellExecuteWait("scite.exe", "container.dat") ;dateiinhalt anzeigen in scite
[/autoit][autoit][/autoit][autoit]
;nun sind alle Dateien fertig verpackt in der Container-DateiMsgBox(0, 0, "Dateien sind im Container. Nun Dateien wieder auspacken und in Verzeichnis \pics2 schreiben...")
[/autoit][autoit][/autoit][autoit]
;alle wieder auspacken in das Verzeichnis \pics2If 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
[/autoit][autoit][/autoit][autoit]
$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$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
[/autoit][autoit][/autoit][autoit]
;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$aFilelist = _FileListToArray(@ScriptDir & "\pics2\", "*", 1) ;nur Dateien anzeigen, Filter ggf anpassen
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
_ArrayDisplay($aFilelist);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 -
Vielen dank, das hilft mir enorm!