gpt4 book ai didi

java - Java 中的流图像格式转换和大小调整

转载 作者:搜寻专家 更新时间:2023-11-01 03:36:38 25 4
gpt4 key购买 nike

所以,假设我想用 Java 将一些 PNG 重新编码为 JPEG。该图像具有极高的分辨率,例如 10 000 x 10 000 像素。使用“标准”Java 图像 API Writers 和 Reader,您有时需要在 RAM 中解码整个图像,这会占用大量 RAM 空间(数百 MB)。我一直在寻找其他工具如何做到这一点,我发现 ImageMagick 使用磁盘像素存储,但这似乎对我的需要来说太慢了。所以我需要的是真正的流媒体记录器。我所说的真正流式传输是指通过 block 或箱读取和处理数据,不仅仅是将流作为输入,而是预先将其整体解码。

现在,首先是背后的理论 - 考虑到 JPEG 和 PNG 算法,是否有可能使用流来执行此操作,或者说在数据箱中?所以不需要将整个图像编码在内存(或其他存储)中?在 JPEG 压缩中,前几个阶段可以在流中完成,但我相信霍夫曼编码需要在量化后构建整个值(value)概率树,因此它需要分析整个图像 - 所以整个图像需要预先解码,或者以某种方式按需解码按地区划分。

还有一个黄金问题,如果可以实现上述目标,是否有任何 Java 库可以实际以这种方式工作?并节省大量内存?

最佳答案

如果我创建一个 10,000 x 10,000 的 PNG 文件,充满不可压缩的噪音,像这样使用 ImageMagick:

convert -size 10000x10000 xc:gray +noise random image.png

我看到 ImageMagick 使用 675M 的 RAM 来创建生成的 572MB 文件。

我可以像这样用 vips 将它转换成 JPEG:

vips im_copy image.png output.jpg

vips 在转换时使用不超过 100MB 的 RAM,并且在 4 岁左右的合理规范 iMac 上花费 7 秒 - 尽管有 SSD。

关于java - Java 中的流图像格式转换和大小调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29797570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com