【问题标题】:Why ImageIO.read() SOOO slow?为什么 ImageIO.read() 这么慢?
【发布时间】:2016-11-07 15:12:06
【问题描述】:

所以我正在尝试从流中获取 PNG 图像。

image = ImageIO.read(inputStream);

这段代码运行了十秒钟!我以为问题出在 InputStream 慢,所以我尝试先将其加载到缓冲区中。

byte[] bytes = inputStreamToBytes(inputStream);
image = ImageIO.read(new ByteArrayInputStream(bytes));

你猜怎么着!将它从 InputStream 加载到缓冲区大约需要 100 毫秒,但是从字节数组中读取它需要很多时间!十(十)秒阅读!从内存!

我在树莓派上做。是的,我知道这是一个玩具,而不是真正的电脑。所以我试着在我的 MacBook Air 上做这件事。真的,两秒比十秒好。但是对于一些 800x600 PNG 来说仍然很多。那为什么会这样呢?又该怎么办?

【问题讨论】:

  • Java 的 ImageIO 对每个人来说都太慢了……我怀疑你做错了什么。
  • ^ 这是一个大胆的声明。但是,您能否提供(上传)您尝试加载的文件?它似乎有些具体,但要验证这一点:对于每张任意、随机、800x600 的图像,还是仅对于这个特定的图像,它是否如此缓慢? (也许它有一些奇怪的、不寻常的格式、压缩类型等等......)
  • @Marco13 ImageIO 确实以莫名其妙的缓慢着称,即使在检查了源代码之后也是如此。
  • 这是“adb shell screencap -p”的截图
  • 你做错了。 ;-) 默认情况下,ImageIO 使用磁盘缓存,即使从内存中的输入流中读取...尝试使用 ImageIO.setUseCache(false) 来获得“免费”速度提升。

标签: java inputstream javax.imageio


【解决方案1】:

您可能需要安装默认未安装的 Java Native IO 库。

http://www.oracle.com/technetwork/java/install-jai-imageio-1-0-01-139659.html

如果您没有安装此库,则所有对图像的操作都是在 java 中执行的,而不是原生的。

【讨论】:

  • 虽然 JAI(使用本机编解码器,如本例中的 libpng)在某些情况下可能会有所帮助,但我怀疑 JAI 是否带有用于 Raspberry Pi 的预构建本机二进制文件。 JAI 已经好几年没有开发了。为 libpng 创建自己的 JNI 接口可能是更好的选择。
  • OpenJDK 是否包含原生 IO?
  • @user1748526 JPEG 编码/解码使用本机代码 (libJPEG)。其他任何东西都不是原生的。 AFAIK。
猜你喜欢
  • 1970-01-01
  • 2021-09-03
  • 2016-09-28
  • 2020-02-08
  • 2012-07-17
  • 2011-11-07
  • 2015-08-24
  • 2013-08-06
  • 2014-07-16
相关资源
最近更新 更多