Loading [MathJax]/jax/element/mml/optable/GeneralPunctuation.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Android 内存优化】Bitmap 图像尺寸缩小 ( 设置 Options 参数 | inJustDecodeBounds | inSampleSize | 工具类实现 )

【Android 内存优化】Bitmap 图像尺寸缩小 ( 设置 Options 参数 | inJustDecodeBounds | inSampleSize | 工具类实现 )

作者头像
韩曙亮
发布于 2023-03-27 13:54:22
发布于 2023-03-27 13:54:22
3.1K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

一、解码图片参数 inJustDecodeBounds


1 . 解码图片参数 :

① 设置获取参数解码选项 : 设置解码时的 BitmapFactory.Options 对象的 inJustDecodeBounds 为 true ,

② 解码图像 : 解析器返回的 Bitmap 对象为 null ;

③ 解码选项 : BitmapFactory.Options 中的 outXxx 字段会被设置对应的图片属性值 ;

④ 解码选项参数示例 : 如 : outWidth 输出图像的 宽度 , outHeight 输出高度 , outMimeType 输出类型 , outConfig 像素格式 , outColorSpace 输出颜色空间 ;

2 . 代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bitmap 图片加载选项
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(resources, iamgeResId, options);

二、计算图片的缩小比例


计算图片的缩小比例 :

① 目标图片宽高要求 : 宽度和高度只要存在一个大于限定的最大值时 , 就进行缩小操作 ; 要求指定的图片必须能放到 maxBitmapWidth 宽度 , maxBitmapHeight 高度的矩形框中 ; 最终要求就是 宽度必须小于 maxBitmapWidth, 同时高度也要小于 maxBitmapHeight ;

② 缩小倍数要求 : 缩小倍数只能是 2 的幂次方值 , 1 , 2 , 4 , 8 , 16 , 32 , 64 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        /*
            计算缩小的比例
            宽度和高度只要存在一个大于限定的最大值时 , 就进行缩小操作
            要求指定的图片必须能放到 maxBitmapWidth 宽度 , maxBitmapHeight 高度的矩形框中
            最终要求就是 宽度必须小于 maxBitmapWidth, 同时高度也要小于 maxBitmapHeight
         */
        if(imageWidth > maxBitmapWidth || imageHeight > maxBitmapHeight){
            // 如果需要启动缩小功能 , 那么进入如下循环 , 试探最小的缩放比例是多少
            while ( imageWidth / inSampleSize > maxBitmapWidth ||
                    imageHeight / inSampleSize > maxBitmapHeight ){
                // 注意该值必须是 2 的幂次方值 , 1 , 2 , 4 , 8 , 16 , 32 , 64
                inSampleSize = inSampleSize * 2;
            }

            // 执行到此处 , 说明已经找到了最小的缩放比例 , 打印下最小比例
            Log.w(TAG, "getResizedBitmap inSampleSize=" + inSampleSize);
        }

三、设置图片缩小配置 inSampleSize


1 . 图片缩小配置 inSampleSize :

① inSampleSize 设置大于 1 : 如果值大于 1 , 那么就会缩小图片 ;

② 解码器操作 : 此时解码器对原始的图片数据进行子采样 , 返回较小的 Bitmap 对象 ;

③ 样本个数 : 样本的大小是在两个维度计算的像素个数 , 每个像素对应一个解码后的图片中的单独的像素点 ;

④ 样本个数计算示例 : 如果 inSampleSize 值为 2 , 那么宽度的像素个数会缩小 2 倍 , 高度也会缩小两倍 ; 整体像素个数缩小 4 倍 , 内存也缩小了 4 倍 ;

2 . inSampleSize 取值要求 :

① 小于 1 取值 : 如果取值小于 1 , 那么就会被当做 1 , 1 相当于 2 的 0 次方 ;

② 取值要求 : 该值必须是 2 的幂次方值 , 2 的次方值 , 如 1 , 2 , 4 , 8 , 16 , 32

③ 不合法值 : 如果出现了不合法的值 , 就会就近四舍五入到最近的 2 的幂次方值

3 . 代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BitmapFactory.Options options = new BitmapFactory.Options();
// ... 
options.inSampleSize = inSampleSize;

四、设置图片像素格式 inPreferredConfig


1 . 解码像素格式 :

① 指定配置解码 : 如果配置为非空 , 解码器会将 Bitmap 的像素解码成该指定的非空像素格式 ;

② 自动匹配配置解码 : 如果该配置为空 , 或者像素配置无法满足 , 解码器会尝试根据系统的屏幕深度 , 源图像的特点 , 选择合适的像素格式 ; 如果源图像有透明度通道 , 那么自动匹配的默认配置也有对应通道 ;

③ 默认配置 : 默认使用 ARGB_8888 进行解码

2 . 代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
options.inPreferredConfig = Bitmap.Config.RGB_565;

五、设置图片复用机制


1 . 图片复用机制 :

① 图片复用 : 如果设置了一个 Bitmap 对象给 inBitmap 参数 , 解码方法会获取该 Bitmap 对象 , 当加载图片内容时 , 会尝试复用该 Bitmap 对象的内存

② 无法复用抛出异常 : 如果解码方法无法复用该 Bitmap 对象 , 解码方法可能会抛出 IllegalArgumentException 异常 ;

③ 图片可变性 : 当前的实现是很有必要的 , 被复用的图片必须是可变的 , 解码后的 Bitmap 对象也是可变的 , 即使当解码一个资源图片时 , 经常会得到一个不可变的 Bitmap 对象 ;

2 . 解码结果判定 :

① 解码可能失败 : 该解码方法返回的 Bitmap 对象是可以使用的 , 鉴于上述约束情况 和 可能发生的失败故障 , 不能假定该图片解码操作是成功的 ;

② 检查复用是否成功 : 解码检查解码返回的 Bitmap 对象是否与设置给 Options 对象的 inBitmap 相匹配 , 来判断该 inBitmap 是否被复用 ;

③ 后续操作 : 不管有没有复用成功 , 你应该使用解码函数返回的 Bitmap 对象 , 保证程序的正常运行 ;

3 . 与 BitmapFactory 配合使用 :

Android 4.4 以后的复用机制 : 在 KITKAT 以后的代码中 , 只要被解码生成的 Bitmap 对象的字节大小 ( 缩放后的 ) , 小于等于 inBitmap 的字节大小 , 就可以复用成功 ;

② Android 4.4 之前的复用机制 : 在 KITKAT ( Android 4.4 系统 , android-19 平台 ) 之前的代码中 , 被解码的图像必须是

  • JPEG 或 PNG 格式 ,
  • 并且 图像大小必须是相等的 ,
  • inssampleSize 设置为 1 ,

才能复用成功 , 另外被复用的图像的 像素格式 Config ( 如 RGB_565 ) 会覆盖设置的 inPreferredConfig 参数

4 . 代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
options.inBitmap = inBitmap;

六、Bitmap 图像尺寸缩小代码示例


1、图片缩小工具类

图片缩小工具类 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.bm.utils;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;

/**
 * Bitmap 尺寸缩小
 */
public class BitmapSizeReduce {
    private static final String TAG = "BitmapSizeReduce";

    /**
     * 获取指定尺寸于鏊求的 Bitmap 对象
     * 该方法有缺陷 , 计算值的时候没有考虑像素密度
     * 如果从不同像素密度的资源文件中加载
     * 可能计算出的值与指定的 maxBitmapWidth maxBitmapHeight 略有出入
     *
     * @param context           上下文对象
     * @param iamgeResId        要解析的图片资源 id
     * @param maxBitmapWidth    Bitmap 的最大宽度
     * @param maxBitmapHeight   Bitmap 的最大高度
     * @param hasAlphaChannel   是否包含 ALPHA 通道, 即透明度信息
     * @param inBitmap          复用的 Bitmap, 将新的 Bitmap 对象解析到该 Bitmap 内存中
     * @return  返回新的 Bitmap 对象
     */
    public static Bitmap getResizedBitmap(Context context,
                                          int iamgeResId, int maxBitmapWidth, int maxBitmapHeight,
                                          boolean hasAlphaChannel, Bitmap inBitmap){

        // 0. 声明方法中使用的局部变量

        // 用于解析资源
        Resources resources = context.getResources();
        // Bitmap 图片加载选项
        BitmapFactory.Options options = new BitmapFactory.Options();
        // 图片宽度
        int imageWidth;
        // 图片高度
        int imageHeight;
        /*
            根据 图片宽度 imageWidth , 图片高度 imageHeight ,
            最大宽度 maxBitmapWidth , 最大高度 maxBitmapHeight ,
            计算出的图片缩放系数 , 该值最终要设置到 BitmapFactory.Options 对象中
         */
        int inSampleSize = 1;

        // 1. 解析图片参数 : 该阶段不解析所有的数据 , 否则会将实际的图片数据解析到内存中 , 这里只解析图片的宽高信息

        /*
            设置 inJustDecodeBounds 为 true , 解析器会返回 null
            但是 outXxx 字段会被设置对应的图片属性值 ,
            如 : outWidth 输出图像的 宽度 , outHeight 输出高度 , outMimeType 输出类型 ,
            outConfig 像素格式 , outColorSpace 输出颜色空间
         */
        options.inJustDecodeBounds = true;

        /*
            由于设置了 inJustDecodeBounds = true , 该方法返回值为空 ;
            但是传入的 BitmapFactory.Options 对象中的 outXxx 字段都会被赋值 ;
            如 outWidth , outHeight , outConfig , outColorSpace 等 ;
            可以获取该图片的宽高 , 像素格式 , 颜色空间等信息
         */
        BitmapFactory.decodeResource(resources, iamgeResId, options);

        // 获取 iamgeResId 图片资源对应的图片宽度
        imageWidth = options.outWidth;
        // 获取 iamgeResId 图片资源对应的图片高度
        imageHeight = options.outHeight;


        // 2. 计算图片缩小比例

        /*
            计算缩小的比例
            宽度和高度只要存在一个大于限定的最大值时 , 就进行缩小操作
            要求指定的图片必须能放到 maxBitmapWidth 宽度 , maxBitmapHeight 高度的矩形框中
            最终要求就是 宽度必须小于 maxBitmapWidth, 同时高度也要小于 maxBitmapHeight
         */
        if(imageWidth > maxBitmapWidth || imageHeight > maxBitmapHeight){
            // 如果需要启动缩小功能 , 那么进入如下循环 , 试探最小的缩放比例是多少
            while ( imageWidth / inSampleSize > maxBitmapWidth ||
                    imageHeight / inSampleSize > maxBitmapHeight ){
                // 注意该值必须是 2 的幂次方值 , 1 , 2 , 4 , 8 , 16 , 32 , 64
                inSampleSize = inSampleSize * 2;
            }

            // 执行到此处 , 说明已经找到了最小的缩放比例 , 打印下最小比例
            Log.w(TAG, "getResizedBitmap inSampleSize=" + inSampleSize);
        }


        // 3. 设置图像解码参数

        /*
            inSampleSize 设置大于 1 : 如果值大于 1 , 那么就会缩小图片 ;
            解码器操作 : 此时解码器对原始的图片数据进行子采样 , 返回较小的 Bitmap 对象 ;

            样本个数 : 样本的大小是在两个维度计算的像素个数 , 每个像素对应一个解码后的图片中的单独的像素点 ;
            样本个数计算示例 :
            如果 inSampleSize 值为 2 , 那么宽度的像素个数会缩小 2 倍 , 高度也会缩小两倍 ;
            整体像素个数缩小 4 倍 , 内存也缩小了 4 倍 ;

            小于 1 取值 : 如果取值小于 1 , 那么就会被当做 1 , 1 相当于 2 的 0 次方 ;
            取值要求 : 该值必须是 2 的幂次方值 , 2 的次方值 , 如 1 , 2 , 4 , 8 , 16 , 32
            如果出现了不合法的值 , 就会就近四舍五入到最近的 2 的幂次方值
         */
        options.inSampleSize = inSampleSize;

        // 用户设置的是否保留透明度选项 , 如果不保留透明度选项 , 设置像素格式为 RGB_565
        // 每个像素占 2 字节内存
        if (!hasAlphaChannel){
            /*
                指定配置解码 : 如果配置为非空 , 解码器会将 Bitmap 的像素解码成该指定的非空像素格式 ;
                自动匹配配置解码 : 如果该配置为空 , 或者像素配置无法满足 , 解码器会尝试根据系统的屏幕深度 ,
                源图像的特点 , 选择合适的像素格式 ;
                如果源图像有透明度通道 , 那么自动匹配的默认配置也有对应通道 ;
                默认配置 : 默认使用 ARGB_8888 进行解码
             */
            options.inPreferredConfig = Bitmap.Config.RGB_565;
        }

        /*
            注意解码真实图像的时候 , 要将 inJustDecodeBounds 设置为 false
            否则将不会解码 Bitmap 数据 , 只会将
            outWidth , outHeight , outConfig , outColorSpace 等 outXxx 图片参数解码出来
         */
        options.inJustDecodeBounds = false;

        /*
            设置图片可以被复用
         */
        options.inMutable = true;

        /*
            如果设置了一个 Bitmap 对象给 inBitmap 参数
            解码方法会获取该 Bitmap 对象 , 当加载图片内容时 , 会尝试复用该 Bitmap 对象的内存

            如果解码方法无法复用该 Bitmap 对象 , 解码方法可能会抛出 IllegalArgumentException 异常 ;
            当前的实现是很有必要的 , 被复用的图片必须是可变的 , 解码后的 Bitmap 对象也是可变的 ,
            即使当解码一个资源图片时 , 经常会得到一个不可变的 Bitmap 对象 ;

            确保是否解码成功 :
            该解码方法返回的 Bitmap 对象是可以使用的 ,
            鉴于上述约束情况 和 可能发生的失败故障 , 不能假定该图片解码操作是成功的 ;

            检查解码返回的 Bitmap 对象是否与设置给 Options 对象的 inBitmap 相匹配 ,
            来判断该 inBitmap 是否被复用 ;

            不管有没有复用成功 , 你应该使用解码函数返回的 Bitmap 对象 , 保证程序的正常运行 ;

            与 BitmapFactory 配合使用 :

            在 KITKAT 以后的代码中 , 只要被解码生成的 Bitmap 对象的字节大小 ( 缩放后的 )
            小于等于 inBitmap 的字节大小 , 就可以复用成功 ;

            在 KITKAT 之前的代码中 , 被解码的图像必须是
            JPEG 或 PNG 格式 ,
            并且 图像大小必须是相等的 ,
            inssampleSize 设置为 1 ,
            才能复用成功 ;
            另外被复用的图像的 像素格式 Config ( 如 RGB_565 ) 会覆盖设置的 inPreferredConfig 参数
         */
        options.inBitmap = inBitmap;


        // 4. 解码图片 , 并返回被解码的图片

        return BitmapFactory.decodeResource(resources, iamgeResId, options);
    }

}

2、Activity 调用工具类代码

Activity 代码 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.bm;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import kim.hsl.bm.utils.BitmapSizeReduce;

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv = findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
        
        // 缩小图像尺寸
        sizeReduce();


    }

    /**
     * 图像尺寸缩小
     */
    private void sizeReduce(){
        // 从资源文件中加载内存
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.blog);
        // 打印 Bitmap 对象的宽高, 字节大小
        Log.i("Bitmap", "blog : " + bitmap.getWidth() + " , " +
                bitmap.getHeight() + " , " +
                bitmap.getByteCount());

        // 从资源文件中加载内存
        Bitmap reduceSizeBitmap = BitmapSizeReduce.getResizedBitmap(this, R.drawable.blog,
                100, 100 , false , null);
        // 打印 Bitmap 对象的宽高, 字节大小
        Log.i("Bitmap", "reduceSizeBitmap : " + reduceSizeBitmap.getWidth() + " , " +
                reduceSizeBitmap.getHeight() + " , " +
                reduceSizeBitmap.getByteCount());
    }

    public native String stringFromJNI();
}

3、执行结果

执行结果 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-06-30 22:04:22.959 3766-3766/? I/Bitmap: blog : 5224 , 2678 , 55959488
2020-06-30 22:04:22.960 3766-3766/? W/BitmapSizeReduce: getResizedBitmap inSampleSize=32
2020-06-30 22:04:22.980 3766-3766/? I/Bitmap: reduceSizeBitmap : 163 , 81 , 26406

分析结果 :

① 源图像分析 : 从资源中加载 , 普通情况下宽度 5224 像素 , 高度 2678 像素 , ARGB_8888 像素格式 , 每个像素

字节 , 计算公式为

② 缩小后的图像分析 : 从资源中加载 , 普通情况下宽度 163 像素 , 高度 81 像素 , RGB_565 像素格式 , 每个像素

字节 , 计算公式为

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Android 内存优化】Bitmap 图像尺寸缩小 ( 考虑像素密度、针对从不同像素密度资源中解码对应的 Bitmap 对象 | inDensity | inTargetDensity )
在之前讲内存占用的博客中 【Android 内存优化】Bitmap 内存占用计算 ( Bitmap 图片内存占用分析 | Bitmap 内存占用计算 | Bitmap 不同像素密度间的转换 ) , 讲到从不同的像素密度资源中获取图片 , 其解码后的大小不同 ;
韩曙亮
2023/03/27
2.6K0
【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
在【Android 内存优化】自定义组件长图组件 ( 自定义组件构造方法 ) 基础上继续开发 ;
韩曙亮
2023/03/27
2.1K0
【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
6招精通Bitmap内存优化,告别OOM!
Bitmap是Android开发中常用的图像处理类,它能够加载和显示各种格式的图片。然而,Bitmap对象会占用大量的内存,特别是在加载高分辨率图片时,很容易导致内存溢出(OOM)问题。因此,掌握Bitmap优化技巧对于提升Android应用性能至关重要。
Rouse
2024/04/11
6320
6招精通Bitmap内存优化,告别OOM!
Android内存优化-Bitmap内存优化
在日常开发中,我们不免会使用到Bitmap,而bitmap确实实在在的是内存使用的 “大户”,如何更好的使用 bitmap,减少其对 App内存的使用,是我们开发中不可回避的问题。
Petterp
2022/02/09
1.7K0
Android内存优化-Bitmap内存优化
Android Bitmap优化(采样压缩)
Bitmap 的采样压缩(这个采样率是根据需求来进行生成的),使用到了inBitmap内存复用和 inJustDecodeBounds
Zachary46
2021/12/08
1.6K0
Bitmap优化详解
一张图片Bitmap所占用的内存 = 图片长度 x 图片宽度 x 一个像素点占用的字节数
大发明家
2021/12/15
2K0
Android Bitmap 知识点梳理
在日常开发中,可以说和Bitmap每天都会见面,基本上每个应用都会直接或间接的用到,而这里面又涉及到大量的相关知识。 所以这里把Bitmap的常用知识做个梳理,限于经验和能力,不做太深入的分析。
老马的编程之旅
2022/06/22
8000
Android Bitmap 知识点梳理
android 优化之Bitmap优化
Bitmap优化 一个进程的内存可以由2个部分组成:native和dalvik dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的。 一旦内存分配给Java后,以后这块内存即使释放后,也只能给Java的使用,所以如果Java突然占用了一个大块内存, 即使很快释放了,C能用的内存也是16M减去Java最大占用的内存数。 而Bitmap的生成是通过malloc进行内存分配的,占用的是C的内存,这个也就说明了,上述的4MBitmap无法生成的
xiangzhihong
2018/01/26
1.4K0
Android Bitmap那些事之如何优化内存
“安得广夏千万间,大庇天下寒士俱欢颜”——杜甫。 前言:在帝都住的朋友们都可能会遇到租房子困难的问题(土豪请无视),找房子真是力气活,还耗费时间,占用我宝贵的写博客时间,没办法,谁让咱没钱还想住的好点,努力努力挣钱!!!以上发点牢骚,现在进入正题。上一篇博客《Bitmap那些事之内存占用计算和加载注意事项》,写了Bitmap基础知识和使用Bitmap需要知道的注意事项,这一片博客我会写在Android应用中Bitmap的创建和加载。 1、BitmapFactory使用: 说到图片的加载就必须说Bitmap
程序员互动联盟
2018/03/12
7680
Android Bitmap那些事之如何优化内存
Android性能优化(五)之细说Bitmap
在上一篇《Android性能优化(四)之内存优化实战》中谈到那个内存中的大胖子Bitmap,Bitmap对内存的影响极大。 例如:使用Pixel手机拍摄4048x3036像素(1200W)的照片,如果按ARGB_8888来显示的话,需要48MB的内存空间(4048*3036*4 bytes),这么大的内存消耗极易引发OOM。本篇文章就来说一说这个大胖子。
用户2898788
2018/08/21
2.6K0
Bitmap图片压缩,大图加载防止OOM
](https://developer.android.com/topic/performance/graphics/load-bitmap) 这两篇文章中已经做了很明确指出了如何高效的加载大图。这篇文章只是对其中的内容进行总结和扩展(比如图片内存计算、图片压缩等)。
静默加载
2020/05/27
2.9K0
Bitmap详解
getByteCount()方法是在API12加入的,代表存储Bitmap的色素需要的最少内存。API19开始getAllocationByteCount()方法代替了getByteCount()。 这是API26的
提莫队长
2019/02/21
1.5K0
【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )
在上一篇博客 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 ) 中 , 使用 LruCache 缓存 Bitmap 数据到内存中 , 设置其最大缓存为应用可用内存的 1/8 , 将解码后的 Bitmap 对象缓存到 LruCache 中 , 避免重复使用该 Bitmap 对象时重复解码加载图片 ;
韩曙亮
2023/03/27
2.5K0
对Bitmap的内存优化
在Android应用里,最耗费内存的就是图片资源。而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。所以,对于图片的内存优化,是Android应用开发中比较重要的内容。 1) 要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收。这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间。那为什么还需要这个
xiangzhihong
2018/01/30
1.4K0
android计算bitmap内存及内存优化
参考: https://www.cnblogs.com/dasusu/p/9789389.html http://www.cocoachina.com/articles/30884
用户9854323
2022/06/25
5920
android计算bitmap内存及内存优化
android之BitmapFactory.Options的使用
,BitmapFactory.Options的使用是在加载图片时,就从图片的加载和使用说起
全栈程序员站长
2022/07/20
7250
【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )
在上一篇博客 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 ) 中 , 使用 LruCache 缓存内存数据 , 同时兼顾 Bitmap 内存复用 , 使用弱引用 Bitmap 对象集合维护 Bitmap 复用池 , 确保该复用池中的 Bitmap 对象寿命都很短 , 每次 GC 都会清理一遍复用池 ; 当 LruCache 中的数据由于最近不常使用 , 从 LruCache 内存中移除 , 此时将其放入 Bitmap 复用池中 , 将该 Bitmap 对象纳入复用机制管理 ;
韩曙亮
2023/03/27
9480
【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )
ImageLoader 相关知识点
我们不能够通过构造函数创建Bitmap对象。如果需要将图片转成Bitmap对象加载到内存中,就需要使用BitmapFactory类。BitmapFactory跟据图片数据源的不同,提供了几类获取Bitmap的方法。如下:
yuxiaofei93
2018/09/11
5930
Android基础-Bitmap加载
Android开发中比较需要注意的是内存的消耗,而在平时开发中经常会遇到内存占用大的情况是对Bitmap的处理。 其中的基础之一是如何在保证不消耗过大内存的情况下加载一张大图。这也是面试中经常问的一道基础题。
PhoenixZheng
2018/08/07
6760
Android基础-Bitmap加载
高频面试点:Android性能优化之内存优化(下篇)
链接:https://juejin.im/post/5e72b2d151882549236f9cb8
陈宇明
2020/12/16
6400
推荐阅读
相关推荐
【Android 内存优化】Bitmap 图像尺寸缩小 ( 考虑像素密度、针对从不同像素密度资源中解码对应的 Bitmap 对象 | inDensity | inTargetDensity )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档