首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不使用Java将图像加载到内存的情况下裁剪图像

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

Stack Overflow用户
提问于 2015-10-28 19:49:47
回答 1查看 928关注 0票数 2

有没有一种方法可以裁剪一个图像,而不必将整个图像加载到内存中,然后剪切它呢?

场景是,我有一个非常大的图像文件,我有一个直角坐标列表,我需要从大图像中提取出来。图像太大了,我不能直接把它加载到内存中。有没有一种技术,我可以流的图像,并找到开始和结束点的作物?如果我必须对每一组坐标多次执行此步骤,请不要介意。哦,是的,假设图像是JPG/PNG/TIFF格式的,这是最容易处理的。

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-05 11:29:21

您可以使用libvips进行此操作--它可用于Linux、OSX和Windows。

为了进行设置,让我们使用ImageMagick创建一个很大的图像(10,000x10,000),因为它充满了随机噪声,因此很难压缩:

代码语言:javascript
复制
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:

代码语言:javascript
复制
-rw-r--r--@  1 mark  staff  800080278  5 May 12:08 BigBoy.tif

现在,让我们使用libvips (就在命令行)提取左上角和右下角(这些角很容易识别--您看到我在那里做了什么吗?)

代码语言:javascript
复制
vips im_extract_area BigBoy.tif topleft.jpg 0 0 200 200 --vips-leak
memory: high-water mark 118.85 MB

代码语言:javascript
复制
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()函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33400335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档