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    ...

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

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

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

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

Android 4高级编程第三版_3

  • 2013-11-06 13:54
  • 15.85MB
  • 下载

BitmapFactory解码图片不显示(Bitmap too large to be uploaded into a texture (3120x4208, max=4096x4096)

分类: 项目中的BUG(1)2014-07-14 14:52 408人阅读 评论(0) 收藏 举报 BitmapFactory解码一张图片 安卓Bitmap too large t...

HttpClient for android 4 3 5 jar

  • 2015-04-21 12:57
  • 977KB
  • 下载

《Android 4游戏实战编程》略读笔记

《Android 4游戏实战编程》略读笔记 ISBN编号:9787302304982 注意:普通Android开发学习者的实际读书感觉笔记备忘,绝非专家书评。 原作者:这部译著的原作者:...
  • bcrun
  • bcrun
  • 2013-03-04 17:02
  • 656

Android 4高级编程(第3版).part3

  • 2014-10-22 17:20
  • 40.10MB
  • 下载

Android 4高级编程(第3版).part3

  • 2014-10-09 14:48
  • 35.48MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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