代码之家  ›  专栏  ›  技术社区  ›  roberto

ImageMagick的流无法读取TIFF64?

  •  0
  • roberto  · 技术社区  · 7 年前

    我试图提取一个大的BigTIFF图像(TIFF64)的子区域。如果图像不是太大,我可以 convert src.tif dst.jpg 如果图像真的很大, convert 不起作用。我试着用 stream 在不将完整图像加载到内存的情况下提取感兴趣区域。但是,结果是一个0字节的文件。我在这里上传了我的一篇文章:

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

    这个足够小,可以用 流动 :

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

    有没有办法 流动 使用TIFF64? http://imagemagick.org/discourse-server/viewtopic.php?t=22046

    我正在使用ImageMagick 6.9.2-4 Q16 x86_64 2016-03-17

    2 回复  |  直到 7 年前
        1
  •  2
  •   Mark Setchell    7 年前

    vips BigTIFF .

    ImageMagick 对于测试:

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

    我在这里展示了一个较小的JPEG版本:

    enter image description here

    VIP 这样,还可以显示最大内存使用率(使用 --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
    

    /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
  •  2
  •   jcupitt    7 年前

    我同意Mark极好的回答,但我只想说,您使用的TIFF格式可以带来很大的不同。

    常规条形TIFF实际上不支持随机访问,但平铺TIFF支持。例如,这是一个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
    

    $ 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
    

    现在,它可以找到并读出它需要的部分。