如何使用Marvin java库(或任何其他免费库)附加2个BIG图像?

问题描述 投票:0回答:2

我有2个jpeg,大约16 000 x 24 000 px。我必须旋转第二个并将其附加在第一个上面,就像这样

enter image description here

我在文档中找到了如何旋转(MarvinImage.rotate),但我还没有找到一个可以附加2个图像的方法。

此外,非常感谢其他能够做到这一点的图书馆的任何建议。我到现在为止尝试过的事情:

  • BufferedImage和ImageIO:占用大量内存,如果写入工作可能会工作(JPEGImageWriter基本上抱怨图像太大 - 整数溢出)
  • ImageMagick和im4java - 工作但速度非常慢(13分钟和100%磁盘使用率)

谢谢!

波格丹

java image-processing javax.imageio marvin-framework
2个回答
2
投票

libvips可以在很短的时间内快速完成这项任务,但不幸的是,没有方便的Java绑定。你需要使用像pyvips之类的东西写几行,然后再将它写出来。

例如:

import sys
import pyvips

one = pyvips.Image.new_from_file(sys.argv[1])
two = pyvips.Image.new_from_file(sys.argv[2], access='sequential')
one.rot180().join(two, 'vertical').write_to_file(sys.argv[3])

access=暗示new_from_file中的two意味着我们计划从上到下阅读第二张图片,即。与像素出现在jpg文件中的顺序相同。这将使libvips流式传输该图像,因此它可以将two的解码与输出图像的写入重叠。

在这台2015笔记本电脑上,我看到:

$ vipsheader ~/pics/top.jpg ~/pics/bot.jpg
/home/john/pics/top.jpg: 16000x24000 uchar, 3 bands, srgb, jpegload
/home/john/pics/bot.jpg: 16000x24000 uchar, 3 bands, srgb, jpegload
$ /usr/bin/time -f %M:%e ./join.py ~/pics/top.jpg ~/pics/bot.jpg x.jpg
115236:27.85
$ vipsheader x.jpg 
x.jpg: 16000x48000 uchar, 3 bands, srgb, jpegload

所以内存高达115MB,并且实时运行28s。

这将为one创建一个临时文件,以便它可以进行旋转。如果您可以使用大量内存,可以尝试:

one = pyvips.Image.new_from_file(sys.argv[2], memory=True)

这将强制libvips通过内存区域打开。我现在看到:

$ /usr/bin/time -f %M:%e ./join.py ~/pics/top.jpg ~/pics/bot.jpg x.jpg
1216812:14.53

只有15s的实时,但痛苦的1.2GB峰值内存使用。


0
投票

在ImageMagick 6中,这很容易做到。

输入1(lena.jpg):

enter image description here

输入2(mandril3.jpg):

enter image description here

Unix语法:

convert lena.jpg \( mandril3.jpg -rotate 180 \) +swap -append result.jpg

enter image description here

对于Windows语法,请删除\ s。对于ImageMagick 7,用magick替换convert。

ImageMagick附带Linux发行版。它也适用于Mac OSX和Windows。

© www.soinside.com 2019 - 2024. All rights reserved.