美文网首页
处理图片会OOM(OutOfMemoryErrer)分析

处理图片会OOM(OutOfMemoryErrer)分析

作者: bondPang | 来源:发表于2018-05-22 16:36 被阅读0次

Android程序处理图片常常会OOM,有时候我们处理2、3M的图片就会内存溢出。但是我们的手机还有更多的运存。

Android 虚拟机默认为每个应用分配16M堆内存。ps:google原生OS的默认值是16M,但是各个厂家的OS会对这个值进行修改。

我们在看下图片显示手机需要多大内存:当在界面显示图片时,需要的内存空间不是按图片的实际大小来计算的,而是按像素点的多少乘以每个像素点占用的空间大小来计算的。

像素表现有三种模式:

        1. ARGB_4444  :A(Alpha)透明度占4位精度,R(Red)红色占4位精度,G(Green)绿色占4位精度,B(Blue)蓝色占4位精度。总共占16位,正好2个字节。也就是一个像素占2个字节的内存。同时存储位图的透明度和颜色信息。图片质量较差。

        2.ARGB_8888  :  A(Alpha)透明度占8位精度,R(Red)红色占8位精度,G(Green)绿色占8位精度,B(Blue)蓝色占8位精度。也就是一个像素占4个字节的内存。同时存储位图的透明度和颜色信息。图片质量较好。

        3. RGB_565 : R(Red)红色占5位精度,G(Green)绿色占6位精度,B(Blue)蓝色占5位精度,一共是16位精度,总共2个字节。存储的只是颜色信息,没有透明度信息。

当前有一张图片,大小仅为1M,但是其规格(图片的像素)为3648*2736。

那么它在

ARGB_4444模式下是:3648*2736*2bytes=19961856bytes=19M。

ARGB_8888模式下是:3648*2736*4bytes=38M。

RGB_565模式下是:3648*2736*2bytes=19M。

所以在Android默认分配下处理内存16M不够用,有些厂商会自定义。一旦超出这个值就会内存溢出。

解决办法:等比缩放图片

假设:

图片的宽和高: 3648 * 2736

屏幕的宽和高: 320 * 480

计算缩放比:

宽度缩放比例: 3648 / 320 = 11

高度缩放比例: 2736 / 480 = 5

比较宽和高的缩放比例,哪一个大用哪一个进行缩放,因此我们采用11 作为该图片长和高的缩放比例。

计算缩放后的图片的宽和高:

宽=3648 / 11 = 331

高=2736 / 11 = 248

缩放后图片的宽和高: 331* 248

相关文章

网友评论

      本文标题:处理图片会OOM(OutOfMemoryErrer)分析

      本文链接:https://www.haomeiwen.com/subject/hnxkjftx.html