有没有一种方法可以裁剪一个图像,而不必将整个图像加载到内存中,然后剪切它呢?
场景是,我有一个非常大的图像文件,我有一个直角坐标列表,我需要从大图像中提取出来。图像太大了,我不能直接把它加载到内存中。有没有一种技术,我可以流的图像,并找到开始和结束点的作物?如果我必须对每一组坐标多次执行此步骤,请不要介意。哦,是的,假设图像是JPG/PNG/TIFF格式的,这是最容易处理的。
如果存在对本机库的依赖,应该能够在Windows和Linux上运行。
谢谢。
发布于 2016-05-05 11:29:21
您可以使用libvips进行此操作--它可用于Linux、OSX和Windows。
为了进行设置,让我们使用ImageMagick创建一个很大的图像(10,000x10,000),因为它充满了随机噪声,因此很难压缩:
convert -size 10000x10000 xc:gray +noise random \
-fill red -draw "rectangle 0,0 100,100" \
-fill blue -draw "rectangle 9900,9900 10000,10000" BigBoy.tif缩小后,它看起来像这样,左上角有一个红色的矩形,右下角有一个蓝色的矩形,如果你仔细看的话:

重量为800 MB:
-rw-r--r--@ 1 mark staff 800080278 5 May 12:08 BigBoy.tif现在,让我们使用libvips (就在命令行)提取左上角和右下角(这些角很容易识别--您看到我在那里做了什么吗?)
vips im_extract_area BigBoy.tif topleft.jpg 0 0 200 200 --vips-leak
memory: high-water mark 118.85 MB

vips im_extract_area BigBoy.tif bottomright.jpg 9800 9800 200 200 --vips-leak
memory: high-water mark 118.85 MB

这两个命令都使用了大约120 of的内存。我不认为libvips有Java绑定,但我想您可以使用fork()和exec()之类的东西,也可以使用类似于C的system()函数。
https://stackoverflow.com/questions/33400335
复制相似问题