Erstellen und Aufteilen großer mehrseitiger TIFF-Bilder

5346
Karol S

Ich muss mehrseitige TIFF-Bilder erstellen und aufteilen, die von 2 bis fast 100 Seiten reichen (A4, 300 dpi, 2500 × 3500 px). Der Job wird regelmäßig von einem Skript auf einem x64-Linux-Server ausgeführt. Momentan verwende ich Imagemagick. Die kleineren Fälle stellen keine Probleme dar, die größeren jedoch.

Ich muss die Menge des während der Operation verwendeten Speichers radikal reduzieren.

Zum Beispiel das:

convert *.jpg -compress lzw output.tif 

(70 jpeg-Dateien) verbraucht etwa 4,6 GB RAM, obwohl jede Eingabe weniger als 2 MB beträgt, die resultierende Datei weniger als 250 MB.

Der umgekehrte Vorgang:

convert input.tif output-%04d.png 

hat ähnliche Probleme.

Nach allem, was ich gelesen habe, geschieht dies, weil Imagemagick zuerst alle Eingabebilder lädt und dekodiert und erst danach beginnt, sie in die Ausgabedatei zu codieren.

Wie kann ich mehrseitige TIFF-Bilder ohne großen Speicherbedarf erstellen und aufteilen? Ich muss ImageMagick nicht unbedingt verwenden, jedes andere kostenlose Tool ist in Ordnung.

4
Um es etwas zu sagen: Jedes 2500 × 3500-Pixel-Bild benötigt mindestens 2500 × 3500 × 3 Bytes, da es sich im Speicher befindet. Das sind 26250000 Bytes pro Bild, also insgesamt 1837500000 Bytes für 70 Bilder. Dann erstellen Sie ein DUPLICATE davon in der TIF, insgesamt 3675000000. Dann fordern Sie an, es mit lzw-Komprimierung zu speichern. dazu sind wahrscheinlich einige Puffer erforderlich. Vielleicht fügen Sie Puffer zum Schreiben hinzu ... Die Handhabung von Dateien mit 70 bis 100 Seiten ist nicht einfach, vor allem, wenn die Seiten nur Bitmaps sind. Hannu vor 9 Jahren 0
@Hannu Nicht einfach für wen? Die reale Welt sagt, dass es ein Konzept für Streaming-Transformationen gibt. Das Entpacken eines großen Bildstapels gleichzeitig aus dem Speicher ist lahm und flüchtig. polkovnikov.ph vor 8 Jahren 0
Das erste Beispiel "convert" oben erstellt ein einzelnes PAGED-TIFF. Je nachdem, wie Imagemagick intern arbeitet, MÜSSEN Sie tatsächlich einen "großen Bildstapel im Speicher" haben. Hannu vor 8 Jahren 0

1 Antwort auf die Frage

1
tarikki

Ich hatte heute das gleiche Problem, als ich versuchte, ein 1700-Image (1G-Tif-Datei) zu teilen. 16 GB Arbeitsspeicher waren nicht genug, dann wurde versucht, den Cache auf der Festplatte zu speichern, aber das war langsam und es wurden schnell mehr als 100 GB auf der Festplatte verbraucht, ohne irgendetwas zu erreichen (dies war wahrscheinlich ein Fehler).

Anscheinend kann Imagemagick jedoch ein bestimmtes TIF aus der Originaldatei extrahieren, ohne es vollständig laden zu müssen. Daher konnte die größere Datei mit einem einfachen Bash-Skript aufgeteilt werden:

END=2000 for ((i=1;i<=END;i++));do echo $i convert bigassfile.tif[$i] -scene 1 split/smallerfile_$i.tif done 

Keine Idee, wie man eine große Datei erstellt, ohne dass der Speicher ausgeht, ist dies vielleicht eine halbe Antwort?