2017-07-29 62 views
0

我正在嘗試提取大型BigTIFF圖像(TIFF64)的子區域。如果圖像不是太大,我可以只用convert src.tif dst.jpg。如果圖像真的很大,但是,convert不起作用。我試圖使用stream來提取感興趣的區域而不將完整的圖像加載到內存中。但是,結果是一個0字節的文件。我上傳了我的BigTIFFs的一個位置:ImageMagick的Stream無法讀取TIFF64?

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

這一個足夠小,convert工作,並可以產生與stream 0字節的圖像:

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

是否有辦法stream工作?這是TIFF64中stream這個老bug的迴歸嗎? http://imagemagick.org/discourse-server/viewtopic.php?t=22046

我使用ImageMagick 6.9.2-4 Q16 x86_64的2016年3月17日

+0

與'ImageMagick 7.0.6-0 Q16 x86_64 2017-06-12相同的錯誤' – roberto

+0

您是否已將ImageMagick policy.xml文件調整爲適合正常使用的大圖像,而不是使用流?也許你的限制在policy.xml文件中設置得太小了。 – fmw42

+0

請檢查您的鏈接 - 我無法從那裏下載任何內容。 –

回答

2

我無法下載你的形象做任何測試,但你可以考慮使用vips這是非常快速和節儉記憶,特別是對於大圖像 - 我認爲你的是,否則你可能不會使用BigTIFF

所以,如果我們做一個大的萬×10,000 TIF與ImageMagick的來進行測試:

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

,我在這裏展示一個較小的JPEG版本:

enter image description here

您可以提取與vips左上角這樣,並且還顯示最大內存使用量(與--vips-leak):

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

輸出

memory: high-water mark 5.76 MB 

而且你可以提取的右下角是這樣的:

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

輸出

memory: high-water mark 517.01 MB 

使用ImageMagick的,同樣的操作需要的RAM 1.2GB:

/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

我同意馬克的出色答卷,只是想也說,你使用TIFF格式可以有很大的不同。

普通條形TIFFs並不真正支持隨機訪問,但是平鋪的TIFFs可以。例如,這裏有一個10K X 10K像素帶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 

在這裏,TIFF讀者掃描幾乎整個圖像來獲得它需要的位,從而導致較高的內存使用。

如果你有一個平鋪圖像再試一次:

$ 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 

現在,它可以只是尋求並讀出需要的部分。

當然,您可能無法控制圖像格式的細節,但如果您這樣做,您會發現對於這種類型的操作,平鋪圖像速度更快,所需內存更少。