繁体   English   中英

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

[英]How can I append 2 BIG images using Marvin java library(or any other free lib)?

我有2个jpeg,大约16000 x 24000 px。 我必须旋转第二个并将其附加在第一个顶部,像这样

在此处输入图片说明

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

同样,也非常感谢其他图书馆提供的建议。 到目前为止,我一直在尝试:

  • BufferedImage和ImageIO:占用大量内存,如果写入有效,则可能会起作用(JPEGImageWriter基本上抱怨图像太大-整数溢出)

  • ImageMagick和im4java-可以运行,但速度非常慢(13分钟,磁盘使用率100%)

谢谢!

博格丹

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])

new_from_fileaccess=提示有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,可以在28秒内实时运行。

这将为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

实时只有15秒,但峰值内存使用量高达1.2GB。

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

输入1(lena.jpg):

在此处输入图片说明

输入2(mandril3.jpg):

在此处输入图片说明

Unix语法:

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


在此处输入图片说明

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

ImageMagick随Linux发行版一起提供。 它还适用于Mac OSX和Windows。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM