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

标签 java image-processing javax.imageio marvin-framework

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

enter image description here .

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

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

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

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

谢谢!

博格丹

最佳答案

libvips可以快速完成此操作并占用很少的内存,但不幸的是没有方便的 Java 绑定(bind)。您需要使用类似 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_file 上的 access= 提示in 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 峰值内存。

关于java - 如何使用 Marvin java 库(或任何其他免费库)附加 2 个大图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55616116/

相关文章:

matlab - Matlab中图像的边界去除

python - cv2.connectedComponents 无法正常工作

Java 无法使用 javax.imageio 或 Sanselan 读取图像

c# - 我想读取控制台模式子进程的输出

java - 如果Java有垃圾回收,那为什么会出现OutOfMemoryError呢?

java - java -cp java -jar 的区别

matlab - 我的处女帖 : Having trouble with ind2rgb function in matlab

java - 在 Android OnClickListener 匿名类中使用循环索引创建 ImageButtons 网格

java - 导入 java.awt.xxxxx 和 javax.imageio.imageIO?

java - 使用 Java 在 JPEG 中存储 DPI 和纸张尺寸信息