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 autoit.de/wcf/attachment/10105/ Bilder in so ein paket Packen.
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!