0

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

在此处输入图像描述 .

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

此外,也非常感谢其他可以做到这一点的库的任何建议。到目前为止我已经尝试过:

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

  • ImageMagick 和 im4java - 工作但非​​常慢(13 分钟和 100% 磁盘使用)

谢谢!

波格丹

4

2 回答 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])

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

在这台 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 的峰值内存使用令人痛苦。

于 2019-04-11T02:18:52.400 回答
0

在 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。

于 2019-04-10T17:06:37.597 回答