2017-07-29 56 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 

现在,它可以只是寻求并读出需要的部分。

当然,您可能无法控制图像格式的细节,但如果您这样做,您会发现对于这种类型的操作,平铺图像速度更快,所需内存更少。