Bitmap的高效加载

Bitmap的优化及高效加载 Bitmap即位图。在Android中要处理要位图的加载显示并不容易,需要娴熟的管理的设备内存,否则很容易因为位图的加载不恰当占用了应用大量宝贵的内存空间,更严重的导致应用OOM。因此学习好如何高效的加载内存十分重要。幸好,现在有许多十分强大的图片加载框架,它们能够高效顺畅的加载位图,使用起来也非常方便,譬如Glide,picasso等。本文也暂时不去分析这些框架的源码(没复习到,也真的很复杂,不是三言两语能说明白的)。 Bitmap的加载优化呢,大概有三种: 1.采用图片质量... 阅读详情

1、Android内存分配

Android给每个APK分配相应的内存空间,一般情况下只要APK超过个空间的限制,就会报OOM

    Runtime rt = Runtime.getRuntime();
    long maxMemory = rt.maxMemory();
    Log.i("maxMemory:", Long.toString(maxMemory / (1024 * 1024)));

这里写图片描述

在不考虑largeHeap和native的情况下,当前手机分配的内存空间不能超过384M,这个值的大小和手机的配置也有很大关系,在早期的手机中分配空间可能是几十M,包括现在配置比较低的手机也是分配100多M的内存空间,因此开发者必须合理的分配内存空间,避免OOM

2、Bitmap是造成OOM的主要原因之一

对于APP来说,一般加载的都是json数据,主要包括文本和图片,对于文本几乎是没有优化的空间的,而图片对内存的消耗是非常大的,特别是没有经过处理的高清大图。因此开发者需要特别重视对Bitmap图片的处理。

3、高效加载Bitmap

1、采样率压缩

原理:降低图片像素,减小内存占用
1)设置采样率为true
2)取出原始图片宽高
3)设置采样率
4)设置采样率为flase,重新加载图片
示例:

  public static Bitmap compressImageToBitmap(String imagePath){  
        BitmapFactory.Options options = new BitmapFactory.Options();  
        options.inJustDecodeBounds = true;  
        Bitmap bitmap = BitmapFactory.decodeFile(imagePath,options);  
        options.inJustDecodeBounds = false;  
        options.inSampleSize = 2;  

        bitmap = BitmapFactory.decodeFile(imagePath,options); 
        return bitmap;  
    }  

2、质量压缩

原理:改变图片人深度和透明度,减少图片区域某些点相近的像素
示例:

 public static void qualityCompress(Bitmap bmp, File file) {
        // 0-100 100为不压缩
        int quality = 20;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // 把压缩后的数据存放到baos中
        bmp.compress(Bitmap.CompressFormat.JPEG, quality, baos);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(baos.toByteArray());
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3、尺寸压缩

原理:减少图片的宽高来降低像素

 public static void sizeCompress(Bitmap bmp, File file) {
        // 尺寸压缩倍数,值越大,图片尺寸越小
        int ratio = 8;
        // 压缩Bitmap到对应尺寸
        Bitmap result = Bitmap.createBitmap(bmp.getWidth() / ratio, bmp.getHeight() / ratio, Config.ARGB_8888);
        Canvas canvas = new Canvas(result);
        Rect rect = new Rect(0, 0, bmp.getWidth() / ratio, bmp.getHeight() / ratio);
        canvas.drawBitmap(bmp, null, rect, null);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // 把压缩后的数据存放到baos中
        result.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(baos.toByteArray());
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Android进阶之Bitmap的高效加载 一、Bitmap的加载 BitmapFactory提供了四个方法: docodeFiles decodeResource decodeStream decodeByteArray 二、Bitmap的高效加载 采用Bitmap.Options来加载所需尺寸的图片,主要使用它的inSampleSize参数,当inSampleSize大于1缩放。(inSampleSize会向下去2的指数) ... 阅读详情

相关推荐

Android实践:如何高效加载Bitmap

一、BitmapFactory.Options简介 在Android开发中,加载图片过多、过大很容易引起OutOfMemoryError异常,即我们常见的内存溢出。因为Android对单个应用施加内存限制,默认分配的内存只有几M(具体视不同系统而定)。而载入的图片如果是JPG之类的压缩格式(JPG支持最高级别的压缩,不过该压缩是有损的),在内存中展开会占用大量的内存空间,也就容易形成内存溢出;

1024工场 3524

Bitmap加载方式

Bitmap

Ice_Lemon_dc的博客 1501

智能优化电池:基于单片机的电池管理系统

设计简介: 本设计是基于单片机的电池管理系统,主要实现以下功能: 可通过LCD1602显示温度、电压电流值; 可通过按键调整温度、电压和电流的阈值; 用ADC0832将模拟量转换为数字量。 标签:51单片机、LCD1602、ADC0832 效果图: 总体资料: 原理图: 软件设计流程: 系统框图: 本设计以STC89C52单片机为核心控制器,加上其他的模块一起组成电动汽车的电池管理的整个系统,...

专注单片机实战教学,分享单片机学习资料 375

海量数据解决思路之BitMap

一、概述   本文将讲述Bit-Map算法的相关原理,Bit-Map算法的一些利用场景,例如BitMap解决海量数据寻找重复、判断个别元素是否在海量数据当中等问题.最后说说BitMap的特点已经在各个场景的使用性。 二、Bit-Map算法 先看看这样的一个场景:给一台普通PC,2G内存,要求处理一个包含40亿个不重复并且没有排过序的无符号的int整数,给出一个整数,问如果快速地判断这个整数是...

weixin_33946605的博客 345

AXI4-Stream FIFO IP核实战指南——从配置到跨时钟域处理

本文是AXI4-Stream FIFO IP核的实战指南,详细讲解了其作为数据流缓冲核心的作用。文章重点涵盖从Vivado环境下的IP核配置、关键参数(如深度与宽度)设定,到跨时钟域处理的完整流程。深入解析了TVALID/TREADY握手协议及TLAST等信号,并提供了常见问题排查与调试技巧,帮助开发者高效实现FPGA/SoC系统中可靠的数据流缓冲与同步。

weixin_29251567的博客 480

PyCharm与MicroPython联手:打造高效ESP32开发环境

本文详细介绍了如何使用PyCharm与MicroPython打造高效的ESP32开发环境。通过配置PyCharm插件、刷写MicroPython固件以及实战示例,帮助开发者快速上手嵌入式Python开发,显著提升物联网项目的开发效率。

weixin_29169899的博客 380

高效显示Bitmap之高效加载较大的 Bitmaps

图片来源多种多样,多数情况下往往比要求的要大。例如,系统应用程序显示照片画廊通常使用Android设备的相机分辨率远高于你的设备的屏幕密度。 鉴于您在使用有限内存,理想情况下你需要加载一个低分辨率版本在内存中。低分辨率图片应该匹配显示它的UI组件大小。高分辨率图片不提供任何可见的好处,但是占据着宝贵的内存资源并且在动态缩放时带来额外的开销。 本节课教你解码大位图不超过每个应用程序内存限制通过加

mzyl 403

Java8动态生成SFunction:基于字段名的Lambda表达式实践

本文深入探讨了在Java8中如何基于字段名动态生成SFunction,以解决MyBatis Plus的LambdaQueryWrapper在动态查询场景下的局限性。通过核心原理LambdaMetafactory的解析和手把手的代码实现,展示了如何将字符串字段名转换为类型安全的Lambda表达式,从而实现真正动态、类型安全的查询条件构建与通用数据处理,显著提升代码的灵活性与安全性。

sss66的博客 953

在分页式管理方式下实现主存空间的分配和回收

转自:在分页式管理方式下采用位示图来表示主存分配情况,实现主存空间的分配和回收_呱呱乐编程-优快云博客 方便学习,如有侵权,联系本人,立即删除! #include <iostream> #include <stdio.h> #include <String.h> #include<stdlib.h> using namespace std; struct BitMap //用于存储位示图 { int map[8][8]; //8*8=64,位示

qq_53415483的博客 723

【系统架构设计师】预测试卷十:综合知识(75道选择题)

本文包含75道选择题,覆盖计算机系统、操作系统、网络、数据库、软件工程等核心知识域,其中系统架构设计与评估占比最高(19题)。题目难度稍高,注重灵活应用,题干全新且不与前8套重复。部分典型题目解析包括:计算机性能比较(CPU时间公式TLB/页表机制)、Cache写策略、流水线分支惩罚、管程条件变量、LRU近似算法、自旋锁适用场景、TCP字节流特性、Anycast应用、MVCC机制、分布式事务选型等。答案详解强调易错点,如性能比较需综合计算、TLB缺失不等于缺页、

数据知道的博客 478

【离线OCR】微信离线实现图片OCR文本和表格识别

基于微信本地OCR引擎(由最新版微信自动安装)。通过Python对其官方调用逻辑进行完整翻译和封装,使开发者可以用简单的API调用其强大的OCR功能。

专注于医院数据分析技术与系统开发的创作与分享。 2623

Bitmap高效加载

1.Bitmap的基础概念 Bitmap是Android系统中的图像处理的最重要类之,Bitmap可以获取图片的信息,可以将信息进行缩放,裁剪等操作,提供了图片文件的操作支持。 2.Bitmap加载方式 BitmapFactory.decodeFile(); 文件路径 BitmapFactory.decodeByteArray(); 字节数组 BitmapFactory.decodeStr...

计蒙不吃鱼的博客 1万+

【从0到1实战】C# WinForm开发工业级PLC监控系统(完整串口+Modbus RTU/TCP+数据库存储+源码+避坑指南)

做C#工控上位机开发的工程师,尤其是刚入行的新人,最核心的刚需就是开发一套完整的PLC监控系统。这也是工控领域最基础、最核心、应用最广的项目类型——小到单台PLC的设备测控,大到整线的产线监控,本质都是「上位机与PLC通讯,实现数据采集、参数下发、状态监控、数据存储」。碎片化的知识点学了很多,串口会用了、Modbus协议看了、数据库也懂点,但是始终无法把这些知识点串联起来,做出一套能落地的工业级PLC监控系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1559

Bitmap的高效加载策略

一、为什么Bitmap需要高效加载? 现在的高清大图,动辄就要好几M,而Android对单个应用所施加的内存限制,只有小几十M,如16M,这导致加载Bitmap的时候很容易出现内存溢出。如下图所示,便是在开发中经常遇到的异常信息: java.lang.OutofMemoryError:bitmap size exceeds VM budget 为了解决这个问题,就出现了Bitmap的高效加载策略。其实核心思想很简单。假设通过ImageView来显示图片,很多时候ImageView并没有原始图片的尺

Restless Breeze 379

Python办公自动化 2.1开发环境搭建:PyCharm社区版配置Anaconda开发环境

本篇文章主要讲述了如何在windows主机上配置 PyCharm + Anaconda开发环境、以及了如何配置 PyQt界面开发环境,安装过程超级详细,初学者可以照着一步一步来!

超级大洋葱的博客 2584

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android Bitmap高效加载

android,bitmap,oom

zzqFive的博客 424

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Bitmap 的高效加载

Bitmap 的高效加载

方东的博客 1041

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android_Bitmap的高效加载

在讲bitmap的高效加载时我们有必要先来了解认识一下这两个重要的类BitmapFactory和Options。它们之前的关系,从源码中我们可以看到Options是BitmapFactory的一个内部类。 public class BitmapFactory { private static final int DECODE_BUFFER_SIZE = 16 * 1024;

戚继光的博客 547

Bitmap的高效加载以及缓存机制

在实际的开发过程中,经常会对图片进行获取,并为用户展示在界面。由于android系统对每个应用有一定的内存限制,如果不合理的利用就会造成内存泄漏的情况。因此,在加载bitmap时进行恰当的优化,可以节省系统资源。另外,在进行网络、文件系统获取图片资源时,采用缓存机制,减少网络获取次数,会让应用更流畅,用户体验更友好。下面就从bitmap的高效加载、LruCache、DiskLruCache这三方面...

小猪的博客 1388

如何高效的加载Bitmap

个人建议:官网有许多值得我们去学习、发现的东西。同时我讲述的不一定正确,有问题一定要转告我啦,谢谢咯!

人生旅途上的一个脚印 579

Android-笔记 解析Bitmap如何高效加载

关于Bitmap高效加载Bitmap是如何加载的Bitmap实现高效加载要素Bitmap的缓存策略 Bitmap是如何加载的 介绍bitmap高效加载之前,先说一下bitmap是如何加载的。首先呢,bitmap在安卓里面你可以理解为就是指的是一张图片,如何加载bitmap呢,BitmapFactory提供了四个方法:decodeFile、decodeResource、decodeStream和decodeByteArray,对应的就是从文件系统、资源、输入流和字节数组中加载出一个bitmap对象,然后再调用

丁青的Android学习笔记 397

Bitmap高效加载和Cache(一)

Bitmap是我们开发当中无法避开的,因为它而引起的一系列问题也让人头疼不已,虽然现在我们可以利用开源库来极大程度地避免OOM的产生,但我们还是有必要来花点时间来搞清楚Bitmap。我们从以下几个方面一次来分析Bitmap,首先我们加载一张图片所占用的内存是由哪些方面因素决定的?再就是我们如何对这些影响内存的因素进行合理化的调整。内存是如何被占用的我们在运行时可以通过Bitmap.getByteCo

戚继光的博客 1642

Android高效加载Bitmap及缓存机制

Android高效加载Bitmap及缓存机制 Android高效加载Bitmap及缓存机制 高效加载Bitmap Bitmap缓存机制 LruCache DiskLruCache 在Android系统中,由于Bitmap的特殊性以及Android对单个应用施加的内存限制等因素,导致加载Bitmap时很容易出现内存溢出问题,即所谓的OOM。那么,如何高效加载Bitmap来降低内存...

沐雨清风 1225
上一篇: ArcGis Failed to open file. May not be a valid tile package
下一篇: Android自动化测试一(Uiautomator)
android_xiaogang
博客等级 码龄12年 89粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值