如何加快Android Bitmap的速度?

时间:2015-08-03 01:56:04

标签: android bitmap android-bitmap bitmapfactory

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

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

1。提前加载所有Bitmap

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

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

我使用BitmapFactory.decodeFileBitmap加载JPEG,但速度很慢。

3。提取帧时,将整个帧保存到MJPEG文件中并加载特定的#34;帧" (在技术上,字节数组)在需要时进入Bitmap

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

在这种情况下,我还可以尝试加强Bitmap加载?

2 个答案:

答案 0 :(得分:3)

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

你可以试试的一些事情

  1. 如果您可以控制位图的生成方式,请使用RGB565来减少内存消耗(因为ARGB8888为32位,因此RGB565为16位时内存减少50%)
  2. 创建一个较小的图像,然后稍后将其放大
  3. android:largeHeap=true添加到清单,以便您有内存可以使用
  4. LRU缓存位图,这已在Picasso's caching中实现
  5. 如果您愿意,可以手动编译您的jpeg库以满足您的特定需求,但这需要非常重要的工作。这是你现在可以测试的something

答案 1 :(得分:2)

你有几个选择,你的缓存想法很聪明。在我的脑海中,这里有几件事要尝试:

  • 关注图像如此大的原因。该分辨率的图像应该能够压缩到小于2 - 3 MB,如果可以将数据编码为更加压缩的图像格式,它将大大减少应用程序的内存占用,从而加快加载时间< / LI>
  • 如果始终不需要全分辨率照片,您可以尝试按需调整大小,然后如果需要全分辨率照片,则可以加载
  • 在后台加载图片,以便在用户需要时,它们已经存在。这可以通过扩展适配器并在异步任务中加载图像来实现。 Google示例中有一个很好的例子: http://developer.android.com/training/displaying-bitmaps/process-bitmap.html