如何在不使用Java将图像加载到内存中的情况下裁剪图像

时间:2015-10-28 19:49:48

标签: java image image-processing crop

有没有办法裁剪图像而不将整个图像加载到内存中然后裁剪它?

场景是我有一个非常大的图像文件,我有一个矩形坐标列表,我需要从大图像中裁剪出来。图像太大了我无法直接将其加载到内存中。是否有一种技术可以流式传输图像并找到要开始和结束点的方法?如果我必须为每组坐标多次执行此步骤,请不要介意。哦,是的,假设图像格式为JPG / PNG / TIFF,这是最容易使用的。

如果对本机库存在任何依赖性,应该能够在Windows和Linux上运行。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用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

尺寸减小,看起来像这样,左上角有一个红色矩形,右下角有一个蓝色矩形:

enter image description here

并且重量为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

enter image description here

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

enter image description here

两个命令都使用了大约120MB的内存。我不相信libvips有Java绑定,但我认为您可以使用fork()exec()内容或使用C&#39 {s} system()函数