Bitmap优化

Android-Bitmap优化 概述 在日常开发中我们经常遇到加载图片报出oom的错误,我们要解决这个问题,首先要明白oom代表out of memory 内存溢出,因为手机内存有限,分给每个应用的内存有限,所以要解决这个问题就是要解决图片占用内存问题 android 中图片是以bitmap的形式存在的,那么bitmap中所占的内存,直接影响到了是否oom,我们了解一下bitmap的占用内存的计算方法 Bitmap到底占多大内存 从本地加载或者从网络加载可以用下面的公式计算 图片的长度 * 图片的宽度 * 一个像素点占用的字节数 如果 阅读详情

Bitmap优化

  1. 一个进程的内存可以由2个部分组成:native和dalvik
    dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的。
    一旦内存分配给Java后,以后这块内存即使释放后,也只能给Java的使用,所以如果Java突然占用了一个大块内存,
    即使很快释放了,C能用的内存也是16M减去Java最大占用的内存数。
    而Bitmap的生成是通过malloc进行内存分配的,占用的是C的内存,这个也就说明了,上述的4MBitmap无法生成的原因,
    因为在13M被Java用过后,剩下C能用的只有3M了。

  2. 在Android应用里,最耗费内存的就是图片资源。
    在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。

  3. 及时回收Bitmap的内存

    // 先判断是否已经回收
    if(bitmap != null && !bitmap.isRecycled()){
        // 回收并且置为null
        bitmap.recycle();
        bitmap = null;
    }
    System.gc();
  4. 捕获异常
    在实例化Bitmap的代码中,一定要对OutOfMemory异常进行捕获。下面对初始化Bitmap对象过程中可能发生的OutOfMemory异常进行了捕获。
    如果发生了异常,应用不会崩溃,而是得到了一个默认的图片。

    Bitmap bitmap = null;
    try {
        // 实例化Bitmap
        bitmap = BitmapFactory.decodeFile(path);
    } catch (OutOfMemoryError e) {
    //
    }
    if (bitmap == null) {
        // 如果实例化失败 返回默认的Bitmap对象
        return defaultBitmapMap;
    }
  5. 缓存通用的Bitmap对象

  6. 压缩图片
    如果图片像素过大可以将图片缩小,以减少载入图片过程中的内存的使用,避免异常发生。
    使用BitmapFactory.Options.inSampleSize就可以缩小图片。属性值inSampleSize表示缩略图大小为原始图片大小的几分之一。
    即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片的大小就为原始大小的1/4。
    如果知道图片的像素过大,就可以对其进行缩小。那么如何才知道图片过大呢?
    使用BitmapFactory.Options设置inJustDecodeBounds为true后,并不会真正的分配空间,即解码出来的Bitmap为null,
    但是可计算出原始图片的宽度和高度,即options.outWidth和options.outHeight。
    通过这两个值,就可以知道图片是否过大了。

    BitmapFactory.Options opts = new BitmapFactory.Options();
    // 设置inJustDecodeBounds为true
    opts.inJustDecodeBounds = true;
    // 使用decodeFile方法得到图片的宽和高
    BitmapFactory.decodeFile(path, opts);
    // 打印出图片的宽和高
    Log.d("example", opts.outWidth + "," + opts.outHeight);

    在实际项目中,可以利用上面的代码,先获取图片真实的宽度和高度,然后判断是否需要跑缩小。如果不需要缩小,设置inSampleSize的值为1。如果需要缩小,则动态计算并设置inSampleSize的值,对图片进行缩小。需要注意的是,在下次使用BitmapFactory的decodeFile()等方法实例化Bitmap对象前,别忘记将opts.inJustDecodeBound设置回false。否则获取的bitmap对象还是null。

    以从Gallery获取一个图片为例讲解缩放:

    public class MainActivity extends Activity {
        private ImageView iv;
        private WindowManager wm;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            wm = getWindowManager();
            iv = (ImageView) findViewById(R.id.iv);
        }
    
        // 从系统的图库里面 获取一张照片
        public void click(View view) {
            Intent intent = new Intent();
            intent.setAction("android.intent.action.PICK");
            intent.addCategory("android.intent.category.DEFAULT");
            intent.setType("image/*");
            startActivityForResult(intent, 0);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (data != null) {
                // 获取到系统图库返回回来图片的uri
                Uri uri = data.getData();
                System.out.println(uri.toString());
    
                try {
                    InputStream is = getContentResolver().openInputStream(uri);
                    // 1.计算出来屏幕的宽高.
                    int windowWidth = wm.getDefaultDisplay().getWidth();
                    int windowHeight = wm.getDefaultDisplay().getHeight();
                    //2. 计算图片的宽高.
                    BitmapFactory.Options opts = new Options();
                    // 设置 不去真正的解析位图 不把他加载到内存 只是获取这个图片的宽高信息
                    opts.inJustDecodeBounds = true;
                    BitmapFactory.decodeStream(is, null, opts);
                    int bitmapHeight = opts.outHeight;
                    int bitmapWidth = opts.outWidth;
    
                    if (bitmapHeight > windowHeight || bitmapWidth > windowWidth) {
                        int scaleX = bitmapWidth/windowWidth;
                        int scaleY = bitmapHeight/windowHeight;
                        if(scaleX>scaleY){//按照水平方向的比例缩放
                            opts.inSampleSize = scaleX;
                        }else{//按照竖直方向的比例缩放
                            opts.inSampleSize = scaleY;
                        }
    
                    }else{//如果图片比手机屏幕小 不去缩放了.
                        opts.inSampleSize = 1;
                    }
                    //让位图工厂真正的去解析图片
                    opts.inJustDecodeBounds = false;
                    //注意: 流的操作
                    is = getContentResolver().openInputStream(uri);
                    Bitmap bitmap = BitmapFactory.decodeStream(is, null, opts);
                    iv.setImageBitmap(bitmap);
    
                } catch (Exception e) {
                    e.printStackTrace();
            }
            }
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

  • 邮箱 :charon.chui@gmail.com
  • Good Luck!
Bitmap使用优化 BItmap使用优化可以从三个方面进行:内存压缩、对象复用、内存磁盘缓存 一. BItmap内存压缩 当我们读取一个Bitmap图片的时候,有一点一定要注意,就是千万不要去加载不需要的分辨率。在一个很小的ImageView上显示一张高分辨率的图片不会带来任何视觉上的好处,但却会占用我们相当多宝贵的内存。需要仅记的一点是,将一张图片解析成一个Bitmap对象时所占用的内存并不是这个图片在硬盘中的大小(那是各种压缩格式压缩后的大小),可能一张图片只有100k你觉得它并不大,但是读取到内存当中是按照像素点来算的 阅读详情

相关推荐

[Android] Android开发优化之——对Bitmap的内存优化

在Android应用里,最耗费内存的就是图片资源。而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。所以,对于图片的内存优化,是Android应用开发中比较重要的内容。 1) 要及时回收Bitmap的内存Bitmap类有一个方法recycle(),从方法名可以看出意思是回收。这里就有疑问了,Android系统有

::: 移动互联网时代开发者 ::: 4万+

Android性能优化之Bitmap的内存优化

1、BitmapFactory解析Bitmap的原理 BitmapFactory提供的解析Bitmap的静态工厂方法有以下五种: Bitmap decodeFile(...) Bitmap decodeResource(...) Bitmap decodeByteArray(...) Bitmap decodeStream(...) Bitmap decodeFileDescriptor(

Liyunlong 1206

解析Android开发优化之:对Bitmap的内存优化详解

1) 要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收。这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间。那为什么还需要这个方法呢? Bitmap类的构造方法都是私有的,所以开发者不能直接new出一个Bitmap对象,只能通过BitmapFactory类的各种静态方法来实例化一个Bitmap。仔细查看BitmapFactory的源代码可以看到,生成Bitmap对象最终都是通过JNI调用方式实现的。所以,加载Bitmap到内存里以后,是包含两部分内存区域的。简单的说,一部分

Android性能优化系列之Bitmap图片优化

在Android开发过程中,Bitmap往往会给开发者带来一些困扰,因为对Bitmap操作不慎,就容易造成OOM(Java.lang.OutofMemoryError - 内存溢出),本篇博客,我们将一起探讨Bitmap的性能优化。为什么Bitmap会导致OOM?1.每个机型在编译ROM时都设置了一个应用堆内存VM值上限dalvik.vm.heapgrowthlimit,用来限定每个应用可用的最大内

一个码农的博客 1万+

从零到一:基于STM8的125KHz RFID读卡器实现与曼彻斯特码解析实战

本文详细介绍了基于STM8单片机的125KHz RFID读卡器实现过程,重点解析了曼彻斯特码的编码原理与解码算法。通过硬件电路设计、软件实现及性能优化,帮助开发者低成本构建稳定读取EM4100卡片的系统,适用于门禁、考勤等应用场景。

weixin_42525211的博客 236

通达信浮筹多空波段抓牛擒龙指标公式源码

VAR33:=VA3>=REF(VA4,1) AND C<REF(C,1) AND VAR19=60 AND VAR18=0 AND 活跃线>=REF(活跃线,1) AND VA12<REF(VA13,1);DRAWTEXT(VAR28 AND COUNT(VAR28,30)=1,65,' ★超涨注意风险'),COLOR0000FF;DRAWTEXT(VAR26 AND COUNT(VAR26,30)=1,90,' ←继续等'),COLOR00FFFF;浮筹线:VA3,COLORFF00FF;

2401_86043146的博客 5276

Bitmap内存优化--使用BitmapFactory.options及SoftReference解决OutOfMemory问题

解决Bitmap经常出现OutOfMemory: Android手机分配给App的内存并不是无限的(即最大可用内存),而是有固定限制的, Bitmap会非常占用内存,导致OutofMemory问题,有三个策略:策略一:对bitmap进行缩放,直接降低在内存中的存储空间; 策略二:通过SoftReferences(软引用)策略; 策略三:开启线程进行异步加载图片,避免出现卡顿现象。

我的Android合伙人是你么 904

从原理图到PCB:Cadence Allegro 17.4网表同步全流程详解(含第三方网表配置)

本文详细解析了Cadence Allegro 17.4中从Orcad原理图到PCB布局的网表同步全流程。核心内容包括标准的第一方网表同步步骤,以及针对第三方网表导入时关键的封装库路径配置方法,并提供了常见同步错误的排查思路,帮助工程师高效、准确地完成设计数据传递,确保PCB设计顺利开局。

salt9的博客 657

BitmapFactory.Options避免 内存溢出 OutOfMemoryError的优化方法

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的

799

ArduPilot移植到自定义硬件:完整指南

详解如何将ArduPilot成功移植到自定义硬件平台,涵盖环境搭建、代码配置与调试技巧。无论是初学者还是进阶开发者,都能快速掌握ArduPilot在不同硬件上的适配方法,提升开发效率。

weixin_28931449的博客 639

控制科学与工程(自动化)保研经验【4】——浙大篇

控制科学与工程(自动化)保研经验【4】——浙大篇

Control Everything 1万+

Android中Bitmap内存优化

Bitmap内存占用 ≈ 像素数据总大小 = 横向像素数量 × 纵向像素数量 × 每个像素的字节大小。

2501_90425664的博客 2062

【第1章】基于FPGA的图像形态学处理学习教程——目录

本课程介绍图像形态学处理技术,通过腐蚀、膨胀、开运算、闭运算等算子对图像进行优化。腐蚀可去除边缘杂色使线条更清晰,膨胀能填补缺口修复图像,开运算擅长去噪,闭运算则用于修补断裂。课程内容涵盖四大形态学处理的理论分析、MATLAB仿真和FPGA开发实现,包括腐蚀、膨胀、开闭运算以及顶帽变换等操作,最后探讨形态学处理的实际应用场景。通过仿真测试和FPGA开发实践,帮助学员掌握图像"美容塑型"的核心技术。

MATLAB,verilog,python,opencv,tensorflow,caffe,C,C++ 339

Bitmap 图片优化

1、BitmapFactory解析Bitmap的原理 BitmapFactory提供的解析Bitmap的静态工厂方法有以下五种: Bitmap decodeFile(...) Bitmap decodeResource(...) Bitmap decodeByteArray(...) Bitmap decodeStream(...) Bitmap decodeFileDescriptor(....

Caesar Home 308

YOLO+OpenClaw缺陷检测智能体 | 低代码工业质检自动化方案 | 含YOLO模型训练/智能体集成/任务全流程,支持离线日报/预警/趋势分析,解决实时性瓶颈问题(下篇)

某PCB板制造商需要对生产线上的PCB板进行缺陷检测,主要检测划痕、凹坑、污渍和裂纹等缺陷。原有人工检测方式效率仅为200件/小时,漏检率达5%,且检测人员长期工作易疲劳。

qq_36130719的博客 208

【知识点讲解】大模型参数量与计算量(FLOPs)估算方法

指标参数量 (Params)计算量 (FLOPs)含义模型的大小,静态模型的计算复杂度,动态决定因素模型结构(宽度、深度)模型结构 +输入数据(B, S)影响内存占用、磁盘空间运行速度、能耗单位M (百万), B (十亿)工具thopptflopstorchinfothopptflopsfvcore重要提示FLOPs ≠ 速度:FLOPs 是理论计算量。实际速度还受内存带宽 (Memory Bandwidth)并行度硬件架构等因素严重影响。

AI浩 2100

Android Bitmap内存优化

Android开发中,Bitmap是经常会遇到的对象,特别是在列表图片展示、大图显示等界面。而Bitmap实实在在是内存使用的“大客户”。如何更好的使用Bitmap,减少其对App内存的使用,是Android优化方面不可回避的问题。因此,本文从常规的Bitmap使用,到Bitmap内存计算进行了介绍,最后分析...

假装你是大灰狼的专栏 593

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

内存优化之二——Bitmap优化

博客结构1.内存增长分析(1).内存增长问题定位2.Bitmap详解(1).Bitmap内存申请3.Bitmap的优化4.站在巨人肩膀 用简单通俗的话来记录自己对架构的理解 1.内存增长分析 (1).内存增长问题定位 采用adb shell dumpsys meminfo + AS Profiler工具结合 可以从App Summary中看到,现在内存中占用最多的是NativeHeap。然后是Graphics,最后是Code。Graphics是GL这块的内存,一般对于应用层没有更好的办法优化,Code的代

技术人生 654

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android中bitmap优化,Bitmap获取优化

[android]代码库public static Bitmap getBitmapBySimpleSize(Object object, float width,float height) {if (null == object) {return null;}BitmapFactory.Options options = new BitmapFactory.Options();options.i...

weixin_39918928的博客 115

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Bitmap 优化策略

如今市场上有很多封装好的第三方库,对Bitmap内存也是做到了很好的优化,比如Glide、Fresco,每次加载只要直接调用就好,但是除掉第三方库外,我们还是需要去了解一下Bitmap的基本优化手段。 一、Bitmap内存进程 首先我们有必要去了解一下Bitmap的基本知识点,在Android3.0之前,Bitmap的对象是放在Java堆中,而Bitmap的像素是放置在Native内存中,这个时候需要手动的去调用recycle,才能去回收Native内存; 在Android3.0到Android7.0

dengpeng_的博客 850

Android Bitmap优化方案实战

一、Bitmap优化的策略 1、根据不同的密度的设备将图片资源放置再不同的drawable文件夹中。 注释:比当前设备密度低的文件夹中搜到图片,那么在ImageView(宽高在wrap_content状态下)中显示的图片将会被放大.图片放大也就意味着所占内存也开始增多;而在高密度文件夹中搜到图片,图片在该设备上将会被缩小,内存也就相应减少。 2、利用inSampleSize对图片进行尺寸上的压缩。 3、利用inPreferredConfig对图片进行质量上的压缩。 4、Bitmap复用池。 5、

yangjunjin的博客 543
上一篇: Android四大组件之Service
下一篇: Ant打包
CharonChui
博客等级 码龄12年 66粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值