bae*_*aek 6 java bufferedimage bytearrayinputstream javax.imageio
我有一个简单的服务器端代码,它接收一个表示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);
}
Run Code Online (Sandbox Code Playgroud)
它有效,但问题是它的速度慢得令人无法接受.对于100KB的图像,它需要6s.对于900KB的图像,它需要30秒.这是预期的吗?有没有办法让字节数组更快地进行bufferedImage转换?
仅供参考,抓住高度/宽度并不是我打算做的唯一事情.我最终想要处理bufferedImage.所以获得高度/宽度只是一个示例代码.
我认为问题可能与ImageIO默认使用磁盘缓存(到临时文件)的事实有关,即使你的源是a ByteArrayInputStream.因此,如果您的文件系统很慢,无论输入源如何,读取也会很慢.
您可以使用禁用磁盘缓存(以使用更多内存为代价)ImageIO.setUseCache(false).这仍将缓存您的流(以允许向后搜索),但仅限于内存.
ImageIO.setCacheDirectory(cacheDirectory)如果您有更快的磁盘/ ramdisk或类似的存储临时文件,也可以使用缓存目录设置为特定路径.
也就是说,即使对于磁盘缓存读取,您报告的读取时间似乎也不合理.如果问题仍然存在,我建议使用分析器找出花费的时间,并查看可能的优化.
PS:我还有一个ByteArrayImageInputStream可能有助于减少磁盘访问和内存消耗的自定义,如果这真的是问题.
尝试使用以下命令行选项运行您的 java 程序,看看它是否能加快速度:
-Djava.awt.headless=true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2340 次 |
| 最近记录: |