【问题标题】:Byte array to buffered image conversion slow字节数组到缓冲图像的转换很慢
【发布时间】:2013-12-06 15:04:14
【问题描述】:

我有一个简单的服务器端代码,它接收表示 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 的图像,需要 6 秒。对于 900KB 的图像,需要 30 秒。这是预期的吗?有没有办法让字节数组到 bufferedImage 的转换更快?

仅供参考,获取高度/宽度并不是我打算做的唯一事情。我最终想处理缓冲图像。所以获取高度/宽度只是一个示例代码。

【问题讨论】:

    标签: java bufferedimage javax.imageio bytearrayinputstream


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      您从哪里读取图像?字节[]从哪里来?如果您正在从硬盘读取图像,使用BufferedInputStream 可能会有所帮助。

      这可以加快加载速度。但这仅在您从 FileInputStream 中读取时才有帮助。从 ByteArrayInputStream 读取时,它不会有帮助。

      编辑:您能否提供更多信息?字节数组从何而来?

      【讨论】:

      • 字节数组来自HTTP body,由apache tomcat服务器处理调用该函数。
      【解决方案3】:

      尝试使用以下命令行选项运行您的 java 程序,看看它是否能加快速度:

      -Djava.awt.headless=true
      

      【讨论】:

      • 谢谢,我还没有尝试过,但我尝试在隔离环境中运行相同的代码,200KB 只用了 20 毫秒。所以问题看起来不像是代码。上面的设置到底是做什么的?
      • @baekacaek:它将显卡排除在外。如果您从不打算在显示器上显示 BufferedImage,则无需浪费时间将其加载到显卡的 RAM 中。我在本地尝试了您的代码 sn-p,上面的命令行选项将我的测试图像上的运行时间从大约 250 毫秒降低到大约 140 毫秒。 YMMV。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      相关资源
      最近更新 更多