Android 4K高清图片解码显示(3)Bitmap优化

原创 2015年11月20日 15:46:34

上一篇介绍了Android中常用的解码方法。Bitmap是Android开发中经常要使用到的,但是由于Bitmap的使用会占用大量内存,容易造成OOM。Bitmap占用的内存为:像素总数 * 每个像素占用的内存。在Android中,Bitmap有四种像素类型:ARGB_8888、ARGB_4444、ARGB_565、ALPHA_8,他们每个像素占用的字节数分别为4、2、2、1。别看一张图片的大小并不大,但是解码出来之后,一个2000*1000的ARGB_8888类型的Bitmap占用的内存为2000*1000*4=8000000B=8MB,并且每个像素的属性全部保存在内存中!如果是4K高清图片,就会更加庞大。Bitmap优化是Android程序猿必备的技能,常用的优化手段包括:

   1.压缩。通过设置BitmapFactory解码时的属性Options,设置inJustDecodeBounds属性为true,decodeResource()方法就不会生成Bitmap对象,而仅仅是读取该图片的尺寸和类型信息,节约大量内存。       

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

BitmapFactory.decodeResource(getResources(), R.id.test, options);

int imageHeight = options.outHeight;

int imageWidth = options.outWidth;

String imageType = options.outMimeType;

  设置BitmapFactory.Options的inSampleSize属性值,该值表示解析时在长宽两个方向上像素缩小的倍数。inSampleSize的默认值和最小值为1(当小于1时,解码器将该值当做1来处理),且在大于1时,该值只能为2的幂(当不为2的幂时,解码器会取与该值最接近的2的幂)。例如,当inSampleSize为2时,一个2000*1000的图片,将被缩小为1000*500,相应地,它的像素数和内存占用都被缩小为了原来的1/4。下面方法计算可压缩的最大值。  

public static int calculateInSampleSize(

            BitmapFactory.Options options, int reqWidth, int reqHeight) {

    final int height = options.outHeight;

    final int width = options.outWidth;

    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;

        final int halfWidth = width / 2;

        while ((halfHeight / inSampleSize) > reqHeight

                && (halfWidth / inSampleSize) > reqWidth) {

            inSampleSize *= 2;

        }

    }

 

    return inSampleSize;

}

也可以直接设置inSampleSize=2进行压缩。最后,获取压缩之后的图片

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,

        int reqWidth, int reqHeight) {

     final BitmapFactory.Options options = new BitmapFactory.Options();

    options.inJustDecodeBounds = true;

    BitmapFactory.decodeResource(res, resId, options);

 

    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    options.inJustDecodeBounds = false;

    return BitmapFactory.decodeResource(res, resId, options);

}

2.使用Cache

3.使用SoftReference

 

   

关于Android 支持 4K 视频显示的问题总结

问题引入:          Android M 中声称支持原生的4K视频显示,这应该如何理解:原文地址: http://news.mydrivers.com/1/433/433988.htm    ...
  • coloriy
  • coloriy
  • 2017年07月05日 14:55
  • 706

《老罗Android第二季》Bitmap位图解码

1.
  • ymangu
  • ymangu
  • 2014年07月01日 16:10
  • 1347

Mac OS X下Maven的安装与配置

http://www.jianshu.com/p/191685a33786 字数145 阅读4026 评论0 喜欢6 Mac OS X 安装Maven: 下载 Maven...

ble兼容Android 4 进行的部分优化

转载自[android BLE 编程详解](http://blog.csdn.net/qiyei2009/article/details/52026096 “博客”) 最近可穿戴设备发展的很火,而且蓝...

高清时代4K H.265/HEVC来临---OTT/IPTV直播系统大发展

近几年网络电视盒子业务大爆发。乐视、小米、天猫甚至阿里云都有网络电视小盒子的产品。提起这个行业,那么这个词OTT-TV或IPTV对于我们来说是不陌生的。 今天我们不细说OTT-TV和IPTV有什么区别...

Android 4高级编程第三版_3

  • 2013年11月06日 13:54
  • 15.85MB
  • 下载

4K发展面临瓶颈,高清影音本如何破局?

毋庸置疑,4K时代已经来临,从4K视频,到4K影片,再到4K电视,可以说,4K所带来的震撼和影响丝毫不亚于当年的1080P。由于在显示的清晰度和综合效果上,4K都有着得天独厚的优势,所以,业界普遍认为...

高清时代4K H.265/HEVC来临---OTT/IPTV直播系统大发展

除了OTT/IPTV这样的词,似乎目前在互联网电视业务提到H.265还不多。H.265是全新的视频标准。H.265相对H.264,相同画质不仅体积更小,而且传输更快,画质优化也更佳。大众目前对视觉享受...

HttpClient for android 4 3 5 jar

  • 2015年04月21日 12:57
  • 977KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 4K高清图片解码显示(3)Bitmap优化
举报原因:
原因补充:

(最多只允许输入30个字)