Search code examples
imagemagicktiffimagemagick-convert

ImageMagick's Stream can't read TIFF64?


I am trying to extract a subregion of a large BigTIFF image (TIFF64). If the images are not too big, I can just convert src.tif dst.jpg. If the images are really big, though, convert doesn't work. I was trying to use stream to extract the region of interest without loading the complete image in memory. However, the result is a 0 bytes file. I uploaded one of my BigTIFFs here:

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

This one is small enough to work with convert, and it produces the 0 byte image with stream:

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

Is there a way of getting stream to work? Is this a come-back of this old bug in stream with TIFF64? http://imagemagick.org/discourse-server/viewtopic.php?t=22046

I am using ImageMagick 6.9.2-4 Q16 x86_64 2016-03-17


Solution

  • I can't download your image to do any tests, but you could consider using vips which is very fast and frugal with memory, especially for large images - which I presume yours are, else you would probably not use BigTIFF.

    So, if we make a large 10,000 x 10,000 TIF with ImageMagick for testing:

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

    and I show a smaller JPEG version here:

    enter image description here

    You could extract the top-left corner with vips like this, and also show the maximum memory usage (with --vips-leak):

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

    Output

    memory: high-water mark 5.76 MB
    

    And you could extract the bottom-right corner like this:

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

    Output

    memory: high-water mark 517.01 MB
    

    Using ImageMagick, that same operation requires 1.2GB of 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