android - 如何更快地加载Android位图?

标签 android bitmap android-bitmap bitmapfactory

我正在创建一个需要显示视频帧的一系列位图的应用。该应用使用 MediaCodec 将视频解码为多个帧,并获取每个帧的 Bitmap 并将其显示在 ImageView 上。

问题是每个Bitmap的大小约为2~3MB(帧大小为1280 x 720,即720p视频的大小。),因此当Bitmap数量超过60~65时,应用程序会因内存不足而崩溃。为了避免这个问题,我一直在实现 Dtour 算法,该算法仅加载需要立即或很快显示的位图。基本上我一直在尝试这些方法。

1。提前加载所有Bitmap

它的速度足以满足我的需求,但正如前面提到的,当位图的数量超过 60~65 时,应用程序就会崩溃。

2。提取帧时,将每个帧保存到 JPEG 文件中,并在需要时将特定的 JPEG 加载到 Bitmap 中。

我用了BitmapFactory.decodeFileJPEG 加载 Bitmap,但速度很慢。

3。提取帧时,将整个帧保存到MJPEG中文件并在需要时将特定的“帧”(技术上是字节数组)加载到位图中。

我认为如果我从字节数组本身加载Bitmap,性能可能会更好。因此,在提取帧时,我创建了另一个元数据文件,其中包含每个帧的字节索引信息,并在需要时使用该信息加载位图。使用 [BitmapFactory.decodeByteArray]( http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeByteArray(byte[] , int, int)) 。我可以看到速度略有提高,但仍然不够。

在这种情况下,我还可以尝试什么来增强位图加载?

最佳答案

对于您的算法,一些库例如 GlidePicasso可以为您处理。至于编码/解码速度,JPEG 可能是快速将位图刷新到磁盘的最佳选择,因为文件大小很小并且可以由 hardware 支持。 .

一些你可以尝试的事情

  1. 如果您可以控制位图的生成方式,请使用 RGB565 来减少内存消耗(最多可减少 50% 的内存,因为 ARGB8888 是 32 位,而 RGB565 是 16 位)
  2. 创建一个较小的图像,然后再放大
  3. android:largeHeap=true 添加到 list 中,以便您有内存可以使用
  4. 位图的LRU缓存,这已在Picasso's caching中实现还有

如果您愿意,可以根据您的特定需求手动编译 jpeg 库,但这需要大量工作。这是something您现在就可以测试。

关于android - 如何更快地加载Android位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31778416/

相关文章:

android 二维位图绘制

java - 在 Canvas 顶部绘制多行文本

java - 找不到存储的图像

java - 如何设置 MEDIASTORE 以从 android 上的特定文件夹获取图像

android - 单击时如何更改 ImageView 的图像?

android - 发送电子邮件 Intent

java - Android制作一个progressDialog ProgressBar Invisible

android - 使用 kotlin-android-extensions 从子模块导入 View 时 Unresolved 引用

android - 将位图保存到应用程序文件夹

安卓 : How to set an image to an imageview from a url programatically