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

java – 字节数组缓冲图像转换速度慢

发布时间:2020-12-14 05:46:50 所属栏目:Java 来源:网络整理
导读:我有一个简单的服务器端代码,它接收一个表示JPEG格式图像的字节数组,并返回图像的尺寸. public String processImage(byte[] data) { long startTime = System.currentTimeMillis(); ByteArrayInputStream stream = new ByteArrayInputStream(data); Buffered
我有一个简单的服务器端代码,它接收一个表示JPEG格式图像的字节数组,并返回图像的尺寸.
public String processImage(byte[] data) {
    long startTime = System.currentTimeMillis();
    ByteArrayInputStream stream = new ByteArrayInputStream(data);
    BufferedImage bufferedImage;
    bufferedImage = ImageIO.read(stream);

    int height = bufferedImage.getHeight();
    int width = bufferedImage.getWidth();

    long endTime = System.currentTimeMillis();

    return "height="+height+" | width="+width+" | elapsed="+(endTime-startTime);
}

它有效,但问题是它的速度慢得令人无法接受.对于100KB的图像,它需要6s.对于900KB的图像,它需要30秒.这是预期的吗?有没有办法让字节数组更快地进行bufferedImage转换?

仅供参考,抓住高度/宽度并不是我打算做的唯一事情.我最终想要处理bufferedImage.所以获得高度/宽度只是一个示例代码.

解决方法

我认为问题可能与ImageIO默认使用磁盘缓存(临时文件)这一事实有关,即使您的源是ByteArrayInputStream.因此,如果您的文件系统很慢,无论输入源如何,读取也会很慢.

您可以使用ImageIO.setUseCache(false)禁用磁盘缓存(以使用更多内存为代价).这仍将缓存您的流(以允许向后搜索),但仅限于内存中.

如果您有更快的磁盘/ ramdisk或类似的存储临时文件,也可以使用ImageIO.setCacheDirectory(cacheDirectory)将缓存目录设置为特定路径.

也就是说,即使对于磁盘缓存读取,您报告的读取时间似乎也不合理.如果问题仍然存在,我建议使用分析器找出花费的时间,并查看可能的优化.

PS:我还有一个自定义ByteArrayImageInputStream可能有助于减少磁盘访问和内存消耗,如果这确实是问题.

(编辑:李大同)

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

    推荐文章
      热点阅读