加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在Java中读取逐步编码的9000×9000 JPEG需要1分钟

发布时间:2020-12-14 17:47:17 所属栏目:Java 来源:网络整理
导读:当使用 javax.imageio. ImageIO从磁盘加载大分辨率(9000×9000)JPEG时,我的scala应用程序需要超过1分钟.我尝试创建一个仅限 Java的项目,但它仍然需要太长时间 – 大约30秒. 这是我如何加载图像: File file = new File("/Users/the21st/slow2.jpg");Buffered
当使用 javax.imageio. ImageIO从磁盘加载大分辨率(9000×9000)JPEG时,我的scala应用程序需要超过1分钟.我尝试创建一个仅限 Java的项目,但它仍然需要太长时间 – 大约30秒.

这是我如何加载图像:

File file = new File("/Users/the21st/slow2.jpg");
BufferedImage image = ImageIO.read(file);

有没有办法提高阅读逐步编码的大尺寸JPEG JPEG中的性能?

有问题的图像是this one(主持人,请不要重新上传到其他托管网站,以便编码/质量不会改变)

解决方法

好的,这是我的发现到目前为止(老实说,他们有点担心…).

使用与Oracle JRE捆绑在一起的ImageIO的标准JPEG插件:

BufferedImage image = ImageIO.read(file);

在我的电脑(MacBookPro / 2.8GHz i7)上大约18秒钟内读取图像.

使用我的JPEG plugin for ImageIO,它使用一个稍微不同的代码路径(即,您可以通过获取ImageReader并调用readRaster()方法获得相同的结果,然后从中创建一个BufferedImage,代码是不平凡的,所以请参考在项目页面上,如果你想看到代码):

BufferedImage image = ImageIO.read(file);

在我的电脑上大概读取8秒钟的图像.

使用我的BufferedImageFactory课程和AWT工具包:

BufferedImage image = new BufferedImageFactory(Toolkit.getDefaultToolkit().createImage(file.getAbsolutePat??h())).getBufferedImage();

在我的电脑上读取约2.5秒的图像.

使用sun.awt.codec中已弃用的JPEGImageDecoder类:

BufferedImage image = new JPEGImageDecoderImpl(new FileInputStream(file)).decodeAsBufferedImage();

在我的电脑上读?约1.7秒的图像.

所以,这意味着我们应该能够在不到2秒内读取这个图像,即使在Java中也是如此.在这种情况下,JPEGImageReader的性能是可笑的,我真的很想知道为什么.如已经提到的,似乎必须用逐行解码,但仍然应该比这更好.

更新:

只是为了乐趣,我创建了一个由LibJPEG-Turbo Java API支持的快速PoC ImageReader插件.它还不是很复杂,但它允许代码如:

BufferedImage image = ImageIO.read(file);

要读取< 1.5秒我的电脑 PS:I used to maintain ImageIO wrappers for JMagick(类似于@Jordan Doyle提到的代码,但是它可以让你针对ImageIO API进行编程),但是我停止了,因为它太多的工作.也许我必须重新考虑…至少值得检查他的解决方案,如果你不介意依靠JNI /本机代码安装.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读