前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android Bitmap优化(采样压缩)

Android Bitmap优化(采样压缩)

作者头像
Zachary46
发布于 2021-12-08 02:27:24
发布于 2021-12-08 02:27:24
1.6K00
代码可运行
举报
文章被收录于专栏:Zachary46Zachary46
运行总次数:0
代码可运行

Bitmap 的采样压缩(这个采样率是根据需求来进行生成的),使用到了inBitmap内存复用和 inJustDecodeBounds

采样的流程:
  1. 将 BitmapFactory.Options 的 inJustDecodeBounds 参数设置为 true 并加装图片。
  2. 从 BitmapFactory.Options 中取出图片的原始宽和高,它们对应于 outWidth 和 outHeight 参数。
  3. 根据采样率的规则并结合目标 View 的所需要大小计算出采样率 inSampleSize 。
  4. 将 BitmapFactory.Options 的 inJustDecodeBounds 参数设为 false ,然后重新加装图片。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   /**
     * 采样率压缩,这个和矩阵来实现缩放有点类似,但是有一个原则是“大图小用用采样,小图大用用矩阵”。
     * 也可以先用采样来压缩图片,这样内存小了,可是图的尺寸也小。如果要是用 Canvas 来绘制这张图时,再用矩阵放大
     * @param image Bitmap
     * @param compressFormat Bitmap.CompressFormat.JPEG
     * @param requestWidth 要求的宽度
     * @param requestHeight 要求的长度
     * @return
     */
    public static Bitmap compressbySample(Bitmap image, Bitmap.CompressFormat compressFormat, int requestWidth, int requestHeight){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(compressFormat, 80, baos);//0~100质量压缩方法,这里80表示80%不压缩,压缩20%,把压缩后的数据存放到baos中
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.RGB_565;//建议使用
        options.inPurgeable = true;
        options.inJustDecodeBounds = true;//只读取图片的头信息,不去解析真是的位图
        BitmapFactory.decodeStream(isBm,null,options);
        options.inSampleSize = calculateInSampleSize(options,requestWidth,requestHeight);
        //-------------inBitmap------------------
        options.inMutable = true;
        try{
            Bitmap inBitmap = Bitmap.createBitmap(options.outWidth, options.outHeight, Bitmap.Config.RGB_565);
            if (inBitmap != null && canUseForInBitmap(inBitmap, options)) {
                options.inBitmap = inBitmap;
            }
        }catch (OutOfMemoryError e){
            options.inBitmap = null;
            System.gc();
        }

        //---------------------------------------

        options.inJustDecodeBounds = false;//真正的解析位图
        isBm.reset();
        Bitmap compressBitmap;
        try{
            compressBitmap =  BitmapFactory.decodeStream(isBm, null, options);//把ByteArrayInputStream数据生成图片
        }catch (OutOfMemoryError e){
            compressBitmap = null;
            System.gc();
        }

        return compressBitmap;
    }

    /**
     * 采样压缩比例
     * @param options
     * @param reqWidth 要求的宽度
     * @param reqHeight 要求的长度
     * @return
     */
    private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {

        int originalWidth = options.outWidth;
        int originalHeight = options.outHeight;
        
        int inSampleSize = 1;

        if (originalHeight > reqHeight || originalWidth > reqHeight){
            // 计算出实际宽高和目标宽高的比率
            final int heightRatio = Math.round((float) originalHeight / (float) reqHeight);
            final int widthRatio = Math.round((float) originalWidth / (float) reqWidth);
            // 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
            // 一定都会大于等于目标的宽和高。
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;

        }
        return inSampleSize;
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/3 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Imageloader<8>-压缩图片
BTW: 说一下BitmapFactory.Options的inJustDecodeBounds属性,当参数设置为true时,BitmapFactory只会解析图片的原始宽和高,并不会将图片加载到内存中。
小小工匠
2021/08/16
3360
Android Bitmap那些事之如何优化内存
“安得广夏千万间,大庇天下寒士俱欢颜”——杜甫。 前言:在帝都住的朋友们都可能会遇到租房子困难的问题(土豪请无视),找房子真是力气活,还耗费时间,占用我宝贵的写博客时间,没办法,谁让咱没钱还想住的好点,努力努力挣钱!!!以上发点牢骚,现在进入正题。上一篇博客《Bitmap那些事之内存占用计算和加载注意事项》,写了Bitmap基础知识和使用Bitmap需要知道的注意事项,这一片博客我会写在Android应用中Bitmap的创建和加载。 1、BitmapFactory使用: 说到图片的加载就必须说Bitmap
程序员互动联盟
2018/03/12
7560
Android Bitmap那些事之如何优化内存
6招精通Bitmap内存优化,告别OOM!
Bitmap是Android开发中常用的图像处理类,它能够加载和显示各种格式的图片。然而,Bitmap对象会占用大量的内存,特别是在加载高分辨率图片时,很容易导致内存溢出(OOM)问题。因此,掌握Bitmap优化技巧对于提升Android应用性能至关重要。
Rouse
2024/04/11
5990
6招精通Bitmap内存优化,告别OOM!
每个人都要学的图片压缩终极奥义,有效解决 Android 程序 OOM
不管是网上下载下来的也好,还是从系统图片库中读取的图片,都有一个相同的特点:像素一帮较高。同时我们都知道,Android 系统分配给我们每个应用的内存是有限的,由于解析、加载一张图片,需要占用的内存大小,是远大于图片自身大小的。所以,这时程序就可能因为占用了过多的内存,从而出现OOM 现象。那么什么是 OOM 呢?
圆号本昊
2021/09/24
4250
每个人都要学的图片压缩终极奥义,有效解决 Android 程序 OOM
Android笔记:根据图片url获取bitmap或者drawable,然后再进行压缩处理
在做微信分享大图的时候遇到了这个问题,需要通过图片url生成Bitmap,而大家也经常会遇到下面几种情况:
程思扬
2022/01/10
8940
Android经典面试题之图片Bitmap怎么做优化
分辨率的适配主是针对我们放在drawable目录下的图片资源,我们需要不同分辨率的图片来放在对应的目录下来做适配,否则Android系统可能会将我们的图片拉伸导致变形。
AntDream
2024/09/19
880
Android经典面试题之图片Bitmap怎么做优化
拍照/选择相册,图片压缩旋转处理
最近做项目需要用到拍照和选择相册照片,并显示出来imageview 上,然后压缩上传到服务器中,这本是一个非常常见的功能,但对于图片的处理确实一个技术活,稍微不注意会出现oom,图片压缩也要处理的刚刚好,不能浪费用户的流量,也不能过分的压缩使图片失真,这真的不简单,好在开源中国的安卓端app以开源,本人特意从开源中国整理了这个demo,分享给大家。
方志朋
2022/11/30
8210
Bitmap优化详解
一张图片Bitmap所占用的内存 = 图片长度 x 图片宽度 x 一个像素点占用的字节数
大发明家
2021/12/15
2K0
Android内存优化-Bitmap内存优化
在日常开发中,我们不免会使用到Bitmap,而bitmap确实实在在的是内存使用的 “大户”,如何更好的使用 bitmap,减少其对 App内存的使用,是我们开发中不可回避的问题。
Petterp
2022/02/09
1.7K0
Android内存优化-Bitmap内存优化
Android性能优化(五)之细说Bitmap
在上一篇《Android性能优化(四)之内存优化实战》中谈到那个内存中的大胖子Bitmap,Bitmap对内存的影响极大。 例如:使用Pixel手机拍摄4048x3036像素(1200W)的照片,如果按ARGB_8888来显示的话,需要48MB的内存空间(4048*3036*4 bytes),这么大的内存消耗极易引发OOM。本篇文章就来说一说这个大胖子。
用户2898788
2018/08/21
2.6K0
Art of Android Development Reading Notes 12
《Android开发艺术探索》读书笔记 (12) 第12章 Bitmap的加载和Cache
宅男潇涧
2018/08/01
4060
Bitmap图片压缩,大图加载防止OOM
](https://developer.android.com/topic/performance/graphics/load-bitmap) 这两篇文章中已经做了很明确指出了如何高效的加载大图。这篇文章只是对其中的内容进行总结和扩展(比如图片内存计算、图片压缩等)。
静默加载
2020/05/27
2.9K0
相关推荐
Imageloader<8>-压缩图片
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验