当前位置:首页 > 内存 > 正文

bitmap内存大小计算

  • 内存
  • 2024-05-05 21:44:17
  • 8246

一、频繁createBitmap导致的OOM问题记录

我最近正在开发一个与相机相关的应用程序。一般来说,相机输出应该旋转成为前置图像。这是因为相机传感器坐标系与屏幕不一致。更准确地说,没有更多细节。但图像输出带来的一系列问题值得注意。

首先,图像预览输出非常慢并且卡住。现在,你需要小心。不要使用作为ImageReader输出格式。您可以使用_420_888。我猜测原因是如果输出格式是JPEG的话,相机还得帮我们做转码,这在低性能手机上很容易造成卡顿。如果更改格式后格式仍然存在,请考虑减少格式。图像输出的分辨率。至于将YUV转换为Bitmap,可以在网上找到一个C库,它比直接输出JPEG为Bitmap具有更高的性能。

下一步是图像的方向与屏幕不一致。网上搜索RotatingBitmap基本上都是说用

创建一个新的Bitmap,然后释放原来的Bitmap。.这就是陷阱出现的地方。正常这样使用是可以的,但是输出相机预览的时候就有问题了,因为相机预览输出的速度很快。在这种情况下,Bitmap已经来不及这样做了。被释放,它会慢慢泄漏内存,直到发生内存溢出。此外,位图创建会消耗大量内存。当Bitmap创建频繁时,内存消耗非常快,可以选择另一种网上很少提到的方法来旋转Bitmap。使用画布。

我们知道创建Canvas时可以传递Bitmap。此时,Canvas上的所有绘图都会直接绘制在Bitmap上,并且Canvas也有一个drawBitmap方法,其他Bitmap都可以用作画笔。更重要的是,drawBitmap的重载方法之一可以传递到Matrix中,此时解决方案就出来了。我们可以创建一个全局复用的Bitmap,注意旋转后的大小,然后用它来创建Canvas。,那么所有位图旋转都不需要生成新的位图,只需使用tmap在整体Bitmap上进行绘制即可。但事情还没有结束。

通过Bitmap创建的画布的大小就是Bitmap的大小。当我们旋转位图时,需要注意的是,当矩阵旋转时,Bitmap画笔的位置会发生变化。最终的绘图可以输出到位图。位图上可能只绘制了一小部分,甚至没有绘制。此时,我们需要为矩阵添加移动操作,以保持画笔的退出位置与画布一致。具体的移动距离你得自己计算一下,因为我忘记了线生成,所以我的做法是取两条。纸,自己旋转一下,检查一下位置……

至此,所有由摄像头图像输出引起的问题都已经解决了。我只是写下了这几个步骤,但是当我写的时候我就卡住了。我花了半天时间在网上找到了相关的问题录音,所以我把它们保存起来,以免忘记。

——libyuv库可以用来将YUV转换为Bitmap,通过这个库也可以完成旋转操作。如果可以的话,最好不要使用Java进行轮换。