美文网首页自定义View
Android中如何加载显示大尺寸图片不发生OOM

Android中如何加载显示大尺寸图片不发生OOM

作者: 三台东 | 来源:发表于2018-07-01 20:32 被阅读105次

    前言:当加载高清大图时,系统给每个应用分配的内存是有限的,如果一个资源图片太大,加载到内存中后,占用的内存空间也会很大,这样就会造成OOM。那在Android开发中如何正确加载高清大图呢?

                                   采用BitmapFactory.Options进行采样率压缩处理
    

    BitmapFactory这个类提供了多个解析方法(decodeByteArray, decodeFile, decodeResource等)用于创建Bitmap对象,我们应该根据图片的来源选择合适的方法。这些方法会尝试为已经构建的bitmap分配内存,这时就会很容易导致OOM出现。为此每一种解析方法都提供了一个可选的BitmapFactory.Options参数,将这个参数的inJustDecodeBounds属性设置为true就可以让解析方法禁止为bitmap分配内存,返回值也不再是一个Bitmap对象,而是null。虽然Bitmap是null了,但是BitmapFactory.Options的outWidth、outHeight和outMimeType属性都会被赋值。这个技巧让我们可以在加载图片之前就获取到图片的长宽值和MIME类型,从而根据情况对图片进行压缩。

    1、通过BitmapFactory.Options获取实际图片的宽高 1.png 2、计算出压缩的比例inSampleSize image.png 3、加载bitmap到imageview中 image.png
    最终效果图: image.png
    这样的图片局部并不是很清晰,所以加载大图时,需要采用局部加载的方案。
                                   使用BitmapRegionDecoder进行局部加载
    

    BitmapRegionDecoder主要用于显示图片的某一块矩形区域,所以可以利用它来完成大图片的动态区域显示。
    1、简单地使用BitmapRegionDecoder加载局部图片

    image.png
    原图以及效果图 image.png
    2、自定义view通过滑动时获得的坐标不断设置矩形区域的偏移坐标,然后不断绘制View来完成动态显示大图的效果。
    具体实现可以参考鸿神的博客https://blog.csdn.net/lmj623565791/article/details/49300989/

    相关文章

      网友评论

        本文标题:Android中如何加载显示大尺寸图片不发生OOM

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