2017-07-29 3 views
0

Ich versuche, eine Unterregion eines großen BigTIFF-Bilds (TIFF64) zu extrahieren. Wenn die Bilder nicht zu groß sind, kann ich einfach convert src.tif dst.jpg. Wenn die Bilder wirklich groß sind, funktioniert convert nicht. Ich habe versucht, stream zu verwenden, um die Region von Interesse zu extrahieren, ohne das vollständige Bild in Arbeitsspeicher zu laden. Das Ergebnis ist jedoch eine 0-Byte-Datei. Ich lud eine meiner BigTIFFs hier:ImageMagick's Stream kann TIFF64 nicht lesen?

https://mfr.osf.io/render?url=https://osf.io/kgeqs/?action=download%26mode=render

Dieses klein genug ist, mit convert zu arbeiten, und es erzeugt das 0-Byte-Bild mit stream:

stream -map rgb -storage-type char '20-07-2017_RecognizedCode-10685.tif[1000x1000+10000+10000]' 1k-crop.dat

Gibt es eine Möglichkeit von stream zu arbeiten? Ist das ein Comeback dieses alten Bugs in stream mit TIFF64? http://imagemagick.org/discourse-server/viewtopic.php?t=22046

Ich bin mit ImageMagick 6.9.2-4 Q16 x86_64 2016-03-17

+0

Gleicher Fehler mit 'ImageMagick 7.0.6-0 Q16 x86_64 2017-06-12' – roberto

+0

Haben Sie Ihre ImageMagick policy.xml-Datei für große Bilder für den normalen Gebrauch mit Convert anstelle von Stream angepasst? Vielleicht sind Ihre Limits in der Datei policy.xml zu klein eingestellt. – fmw42

+0

Bitte überprüfen Sie Ihren Link - ich kann nichts von dort herunterladen. –

Antwort

2

ich nicht Ihr Bild herunterladen können alle Tests zu tun, aber man konnte mit vips betrachten, die sehr schnell und sparsam mit Speicher, vor allem für große Bilder - die ich vermute, sind Ihre, sonst würden Sie wahrscheinlich nicht BigTIFF verwenden.

Also, wenn wir machen eine große 10.000 x 10.000 TIF mit ImageMagick für die Prüfung:

convert -size 10000x10000 gradient:cyan-magenta -compress lzw test.tif 

und ich zeigen eine kleinere JPEG-Version hier:

enter image description here

Sie könnten extrahieren die obere linke Ecke mit vips wie folgt, und zeigen auch die maximale Speichernutzung (mit):

vips crop test.tif a.jpg 0 0 100 100 --vips-leak 

Ausgabe

memory: high-water mark 5.76 MB 

Und man konnte die rechte untere Ecke wie folgt extrahieren:

vips crop test.tif a.jpg 9000 9000 1000 1000 --vips-leak 

Ausgabe

memory: high-water mark 517.01 MB 

Verwenden ImageMagick, dass gleiche Operation erfordert 1,2 GB RAM:

/usr/bin/time -l convert test.tif -crop 1000x1000+9000+9000 a.jpg 
     2.46 real   2.00 user   0.45 sys 
1216008192 maximum resident set size 
     0 average shared memory size 
     0 average unshared data size 
     0 average unshared stack size 
    298598 page reclaims 
2

ich mit Mark ausgezeichnete Antwort zustimmen, aber wollte nur auch sagen, dass das TIFF-Format Sie können einen großen Unterschied machen.

Regelmäßige Streifen-TIFFs unterstützen keinen direkten Zugriff, aber gekachelte TIFF-Dateien.Zum Beispiel, hier ist ein 10k x 10k Pixel Streifen TIFF:

$ vips copy wtc.jpg wtc.tif 
$ time vips crop wtc.tif x.tif 8000 8000 100 100 --vips-leak 
real 0m0.323s 
user 0m0.083s 
sys  0m0.185s 
memory: high-water mark 230.80 MB 

Hier wird der TIFF-Leser fast das ganze Bild auf das Bit zu erhalten scannen muss es braucht, was zu relativ hohen Speicherverbrauch.

Wenn Sie versuchen Sie es mit einem gekachelten Bild:

$ vips copy wtc.jpg wtc.tif[tile] 
$ time vips crop wtc.tif x.tif 8000 8000 100 100 --vips-leak 
real 0m0.032s 
user 0m0.017s 
sys  0m0.014s 
memory: high-water mark 254.39 KB 

Jetzt kann es nur versuchen, und das Teil ausgelesen es braucht.

Sie haben natürlich keine Kontrolle über die Details des Bildformats, aber wenn Sie dies tun, werden Sie feststellen, dass für diese Art von Operation gekachelte Bilder wesentlich schneller sind und viel weniger Speicher benötigen.