安卓漫漫路之BitmapFactory高效加载Bitmap.

unity上面调用andorid相册的插件-android部分 由于最近项目需要做,一个简单的unity3d上面链接android原生相册获取图片的插件,于是乎简单的了解了一下,以下是实现步骤: 1.从unity3d的项目路径中拷出jar包unity3D5.0\u3d\Unity\Editor\Data\PlaybackEngines\androidplayer\release\bin\classess 2.新建一个acitivity把clas 阅读详情

BitmapFactory之高效加载Bitmap图片.

------引语:--------

Bitmap简介:
Bitmap(位图,位映像) : 在Android中指的是一张图片 . 例如png格式或者jpg格式.

那么如何加载Bitmap呢?
咱们可以利用BitmapFactory类(package android.graphics) , 此类提供了几类加载图片的方法:
  • decodeByteArray(byte[] data, int offset,int length):从指定字节数组的offset位置开始,将长度为length的字节数据解析成Bitmap对象.
  • decodeFIle(String pathName):从pathName指定的文件中解析 , 创建Bitmap对象.
  • decodeFileDescriptor(FileDescriptor fd):用于从FileDescriptor对应的文件中解析 , 创建Bitmap对象.
  • decodeResource(Resource res,int id):用于根据给定的资源ID从指定的资源文件中解析 , 创建Bitmap对象.
  • decodeStream(InputStream is):用于从指定输入流中介解析 , 创建Bitmap对象.
分别用于支持从文件系统 , 资源 , 输入流和字节数组中加载出一个Bitmap对象 . 并且decodeFile函数和decodeResoure函数最终也会调用decodeStream函数.

PS:此时想到了个题外话 : 
解析字符串时的getString函数和optString函数的区别:
如果字符串为null,前者会报错,后者不会报错.
------正题:--------

絮絮叨叨半天 , 到底怎么才能高效的加载一个Bitmap对象呢 (个人认为高效加载即为缩放):
核心思想 : 就是采用BitmapFactory.Options类(内部类)来加载所需尺寸的图片 . 
此类用于解码Bitmap时的各种参数控制;
加载图片时ImageView是没有原始图片那么大的 . 此时把整个图片完全的加载进ImageView的话显然没有必要 , 并且在Android手机上ImageView也并没有办法显示原图大小,没办法的话咱们就得缩小加载,要问怎么压缩您接着往下看.

BitmapFactory.Options这个类中:
其中有一个字段叫做 inJustDecodeBounds . SDK中对这个成员的说明是这样的:
If set to true, the decoder will return null (no bitmap), but the out…
也就是说,如果我们把它设为true , 那么BitmapFactory.decodeFile(String path, Options opt)并不会真的返回一个Bitmap给你 , 它仅仅会把它的宽和高取回来给你 , 这样就不会占用太多的内存 , 并且我们也需要适时的回收对象 , 利用下方代码:
if(!bitmap.isRecycled()){  
    bitmap.recycle(); //回收图片所占的内存  
    System.gc(); //提醒系统及时回收  
  }  
及时回收,就不会那么频繁的发生OOM了,也提高了Bitmap加载时的性能.

------开始--------

得到了原始宽高 , 又有什么用呢 ? 咱们需要的可是缩放啊:
您以为BitmapFactory.Options(内部类)就只能获取原始大小么 ? 那肯定是不可能的 . 
BitmapFactory.Options类(内部类)档案也可以用来缩放图片:
主要是用到了他的inSampleSize参数,即采样率.

inSampleSize简介:
当inSampleSize等于1时,得到的是原图大小;
当inSampleSize等于1时,效果同1,即得到的是原图大小;
当inSampleSize等于2时,那么采样之后的图片宽高均为原图的1/2,而像素数为原图的1/4,其占有的内存大小也为原图的1/4,例如一张1024*1024*4的图片,即4MB,如果inSampleSize为2,那么采样后的图片占内存512*512*4,即1MB.
官方文档指出:inSampleSize的取值规范应该是2的指数,即1,2,4,8,16等.当然,不遵从也说明咱们随性.

/**
  *如何获取采样率
  */

通过采样率可有效的加载图片,那么到底如何获取采样率呢?您可遵循如下流程:
(1).将BitmapFactory.Options的inJustDecodeBounds参数设为true并加载图片.
(2).从BitmapFactory.Options中取出原图片的原始宽高信息,他们对应于outWidth参数和outHight参数
(3).根据采样率的规则并结合目标ImageView的所需大小计算出采样率inSampleSize.
(4).将BitmapFactory.Options的inJustDecodeBounds参数设为false,然后重新加载图片.
此时加载的图片即为缩放后的图片.
这里说一下inJustDecodeBounds参数,当此参数为true时,BitmapFactory只会解析原图片的原始宽高.并不会去真正的加载图片.如下是抽取的一个工具类

public class BitMapUtils {
    //高效加载BitMap
    public static Bitmap decodeSampleBitmapFormResource(Resources resources, int resourcesId, int reqWidth, int reqHeight){
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(resources,resourcesId,options);
        options.inSampleSize = caculateInSampleSize(options,resourcesId,reqHeight,reqWidth);
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(resources,resourcesId,options);
    }

    private static int caculateInSampleSize(BitmapFactory.Options options, int resourcesId, int reqHeight,int reqWidth) {
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width >reqWidth){
            final int halfHeight = height / 2;
            final int halfWidth = width / 2;
            while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth){
                inSampleSize *= 2;
            }
        }
        return inSampleSize;
    }
}




有了上面两个函数,实际使用的时候就很简单了,比如ImageView所期望的图片大小为100*100像素,那么就可以通过如下方式高效的加载并显示图片:
mImageView.setImageBitmap(BitMapUtils.decodeSampleBitmapFormResource(this.getResources(),R.drawable.icon,100,100));




除了BitmapFactory的decodeResource函数,其他三个函数(decodeFile ,  decodeStream和decodeByteArray.)也是支持采样加载的,并且处理方式也是类似的. 


如有问题请多指正,您的指正使我更我正确的前行.



Python爬虫实战:使用Scrapy+Playwright高效爬取全球专利数据库 本文将详细介绍如何使用Python最新技术栈(Scrapy+Playwright)构建一个高效的专利数据库爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、分布式爬虫架构以及数据存储方案,最终实现一个完整的专利数据采集系统。专利数据是技术创新领域的重要信息资源,包含技术描述、权利要求、申请人信息等宝贵数据。中国国家知识产权局(CNIPA)美国专利商标局(USPTO)欧洲专利局(EPO)世界知识产权组织(WIPO) 阅读详情

相关推荐

双参数威布尔分布(Weibull分布)参数计算(根据故障数据,求双参数威布尔分布的参数详细步骤)

根据故障数据求威布尔分布参数步骤 根据众多文献研究,设备故障数据大多服从指数分布、威布尔分布或对数正态分布。其中威布尔分布较为常用,本文主要介绍威布尔分布的简单应用,并根据某设备故障数据为例简单介绍威布尔分布参数的计算方法。 参考文献11参考文献22 1.双参数威布尔分布的概率密度函数、概率分布函数、可靠度函数: 2.预处理故障数据 将故障数据按时间排序,假设设备分别在以下时间点失效:11.1 、23.5、58.4……则将此时间从小到大排序。并计算中位秩。中位秩的计算公式如下: 其中i表示第几个数据,n

biaochengxiaobai的博客 4万+

要点提炼|开发艺术之Bitmap&Cache

本篇将总结有关图片加载、缓存策略以及优化列表卡顿的知识点: Bitmap的高效加载 缓存策略 LruCache内存缓存 DiskLruCache磁盘缓存 ImageLoader 希望这篇文章对你有帮助~

minmin的博客 430

Vivado时序违约小结

目录1. setup time违约1.1 逻辑级数太高1.2 Fanout太大2. hold time 违约2.1 异步信号处理导致hold time违约 1. setup time违约 建立时间是工程设计中最常遇到的问题了。一般说来,导致建立时间违例主要有两个原因:逻辑级数太大或者扇出太大,当然也可以尝试通过降频来解决建立时间违约。 1.1 逻辑级数太高 Levels指的是逻辑级数logic level,一个logic level的延迟对应的是一个LUT和一个Net的延迟,对于不同的器件,不同频率的设计能

mu_guang_的博客 7155

Android多线程下载远程图片【转】

很多时候我们需要在Android设备上下载远程服务器上的图片进行显示,今天Android123整理出两种比较好的方法来实现远程图片的下载。  方法一、直接通过Android提供的Http类访问远程服务器,这里AndroidHttpClient是SDK 2.2中新出的方法,API Level为8,大家需要注意下,静态访问可以直接调用,如果SDK版本较低可以考虑Apache的Http库,当然HttpU...

weixin_34232363的博客 243

抖音直播小风车跳转企业微信全攻略:企业号申请+落地页配置详解

本文详细解析了抖音直播小风车跳转企业微信的全流程,包括企业号申请、小风车配置和落地页优化。通过实战指南,帮助企业高效实现私域流量沉淀,提升直播转化率,特别适合电商和营销从业者参考。

weixin_29289821的博客 613

英飞凌 AURIX 系列单片机的HSM详解(1)——何为HSM

1. 概述 随着汽车上通信系统越来越复杂,云端远程通信的场景越来越多,信息安全变得越来越重要,在通信领域常用的AES、SHA、RSA等加密算法被越来越多地应用到汽车上。但通常这类加解密算法都需要大量的数学运算,需要消耗很多CPU时间和资源,汽车上的ECU又有比较高的实时性要求,为了节省主CPU的资源,HSM应运而生。 HSM(Hardware Security Module),是MCU上专门用于实现加解密算法的一个外设,它一般会有一个独立的CPU,专门用来进行加解密运算,还有一些针对特定算法的硬件加速器(如

weixin_42967006的博客 4万+

Bitmap的优化方式

Bitmap是android中经常使用的一个类,它代表了一个图片资源。 Bitmap消耗内存很严重,如果不注意优化代码,经常会出现OOM问题,优化方式通常有这么几种: 1. 使用缓存; 2. 压缩图片; 3. 及时回收;至于什么时候需要手动调用recycle,这就看具体场景了,原则是当我们不再使用Bitmap时,需要回收之。另外,我们需要注意,2.3之前Bitmap对象与像素数

SPENCER_HALE的博客 406

YOLOv12改进策略【卷积层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov12精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 684

Android——Bitmap高效加载

我们在编程中,如果要插入一张图片,大部分直接使用ImageView直接加载,但在实际编程当中,有时候图片的原始尺寸并不符合ImageView。 使用BitmapFactory类中的四个方法:decodeFile,decodeResource,decodeStream,decodeByteArray(文件,资源,IO流,字节数组)中加载Bitmap对象,可以使用InSampleSize采样率来缩小图片,还可以缩小图片内存大小,一定程度避免OOM。 将inJustDecodeBounds设置为true,用于获取

FranzLiszt的博客 605

回归预测 | MATLAB实现SVR(支持向量机回归)K折交叉验证

回归预测 | MATLAB实现SVR(支持向量机回归)K折交叉验证 目录回归预测 | MATLAB实现SVR(支持向量机回归)K折交叉验证基本介绍划分原理留一划分交叉验证K折交叉数据下载程序设计参考资料致谢 基本介绍 在机器学习里,通常来说我们不能将全部用于数据训练模型,否则我们将没有数据集对该模型进行验证,从而评估我们的模型的预测效果。为了解决这一问题,有如下常用的方法: 第一种是最简单的,也是很容易就想到的。我们可以把整个数据集分成两部分,一部分用于训练,一部分用于验证,这也就是我们经常提到的训练集

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 6375

3. LangGraph快速入门

本示例中,我们将使用 Claude Sonnet 4.5 模型,并定义加法、乘法、除法工具。# 定义工具@toolArgs:"""@toolArgs:"""@toolArgs:"""# 为大模型绑定工具图的状态用于存储消息和大模型调用次数。LangGraph 中的状态在整个智能体执行过程中保持持久化。使用带的Annotated类型可以确保新消息追加到现有列表,而不是替换列表。模型节点用于调用大模型,并决定是否调用工具。return {],

Long_像风一样自由 842

Android Bitmap详解

一、Bitmap: Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。 常用方法: public void recycle()  // 回收位图占用的内存空间,把位图标记为Dead public fina...

假装你是大灰狼的专栏 6084

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android开发瓶颈突破指南:从环境搭建到架构优化的实战路径

在移动应用开发领域,Android系统以其开放性占据重要地位,其技术栈的复杂性常使开发者面临多重瓶颈。从构建工具链的配置原理入手,理解Gradle依赖管理与版本兼容机制是项目稳定的基础。掌握性能优化技术,如内存管理与渲染管线分析,能显著提升应用流畅度与用户体验。这些核心能力在电商、社交等高频应用场景中至关重要,直接关系到用户留存与业务增长。本文聚焦Android开发中的典型挑战,通过剖析RecyclerView优化与架构模式选型等热词,为开发者提供从环境调试到系统底层的系统性突破方案。

weixin_30911451的博客 370

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

使用Bitmap.createBitmap 创建和BitmapFactory.decode....获取Bitmap对象

位图基本概念 位图文件的定义:扩展名可以是.bmp或者.dib,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。 根据定义,知道了一个位图的分辨率和色彩,就可以计算出该位图的所占空间大小。如一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/(8*1024)=3072KB 位图文件的特点:图像效

北方啾啾的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Unity3D移动端调用打印机的方式

BitmapFactory创建位图的方式有三种,一种是直接读取安卓图片资源,一种是采用路径读取,还有一种是读取字节数组,我这里采用的是第二种。思路是用Android studio将java代码导出为jar或是aar,然后在unity端调用Java代码。这段代码主要是将图片保存在本地,然后调用安卓打印图片,之所以用固定图片名称,是为了方便读取。源码地址在下面贴出来了,有条件的小伙伴还是支持一下哈,研究不易,实在没积分的,可以私信我。上面这段代码主要是用来加载aar包,遇到变量类型不清楚的,前面可以加var。

qq_41924226的博客 2020

Bitmap 的加载

Bitmap 在 Android 中指的是一张图片,可以是 png 格式,也可以是 jpg 等其他常见的图片格式。如何加载一个 Bitmap 呢? BitmapFactory 类提供了四种解析方法:decodeFile()、decodeResource()、decodeStream() 和 decodeByteArray(),分别用于从文件系统、资源、输入流和字节数组中加载出一个 Bitma

Fabio 334

如何优化加载大位图(BitmapFactory使用系列)

Loading Large Bitmaps Efficiently 如何优化加载大位图 Images come in all shapes and sizes.In many cases they are larger than required for a typical application userinterface (UI). For example, the system Gall...

810364804 170

Android入门——Bitmap和BitmapFactory

我们都知道一个App的成败,首先取决于是否具有优秀的UI,而除了交互功能之外还需要丰富的图片背景和动画去支撑。在开发中我们应用到的图片不仅仅包括.png、.gif、.9.png、.jpg和各种Drawable系对象,还包括位图Bitmap,而且图片的处理也经常是影响着一个程序的高效性和健壮性。

最美不过,心中有梦,身旁有你! 5320

android Bitmap,BitmapFactory类图像处理

[size=medium][color=red][b]BitMap代表一张位图,扩展名可以是.bmp或者.dib。[/b][/color][/size] 位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。 例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/8=307...

写博客只为学习 200

29.UITableViewDataSource详解

UITableViewDataSource这节我们介绍UITableViewDataSource, 它用于定义tableView的显示.下面我们查看它的定义:public protocol UITableViewDataSource : NSObjectProtocol { // 设置行数 @available(iOS 2.0, *) public func tableView

邪恶枫叶的博客 855

java 图片解析,血的教训 BitmapFactory.decodeByteArray() 是个邪恶的方法

BitmapFactory.decodeByteArray()  是个邪恶的方法  , 在android 上 很容易 OOM。      正解如下: /** * 将从Message中获取的,表示图片的字符串解析为Bitmap对象 *  * @param picStrInMsg * @return */ public static Bitmap decodeImg(S

cnsxhza985的专栏 3万+

Bitmap的高效加载

Bitmap的高效加载   Bitmap在Android中是一张图片,可以是png、jpg等常见的图片格式。 BitmapFactory类提供了4类方法来加载图片Bitmap对象: decodeFile:从文件系统. decodeResource:从资源 decodeStream:从输入流(decodeStream比较特殊) decodeByteArray:从字节数组 其中,decodeFile...

手写我对你的温柔 905

jQuery核心知识点复习:选择器、事件委托与Ajax完整梳理

在现代前端开发中,React、Vue 等框架已成为主流,但大量存量项目依然基于 jQuery 构建。对于开发者而言,理解 jQuery 的设计思想——如选择器引擎、链式调用、事件委托和批量 DOM 操作——仍然是理解浏览器原生 API 和框架封装逻辑的重要基础。本文从 jQuery 解决的核心痛点出发,围绕 `$` 函数、常用选择器、事件绑定机制、DOM 增删改查、动画队列和 `$.ajax` 异步请求展开系统性复习,并特别梳理了原生 DOM 与 jQuery 对象互转、版本差异、`noConflict`

weixin_34007020的博客 472

浅谈BitmapFactory.Options

BitmapFactory.optionsBitmapFactory.Options类是BitmapFactory对图片进行解码时使用的一个配置参数类,其中定义了一系列的public成员变量,每个成员变量代表一个配置参数。图片解码建议配置(inPreferredConfig) 参数inpreferredconfig表示图片解码时使用的颜色模式,也就是图片中每个像素颜色的表示方式 图片颜色:计算机表示

showdy的博客 1万+

hdu 6082 度度熊与邪恶大魔王 类完全背包

Problem Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来。邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力。度度熊一共拥有m种攻击方式,第i种攻击方式,需要消耗k[i]的晶石,造成p[i]点伤害。当然,如果度度熊使用第i个技能打在第j个怪兽上面的话,会使得第j个怪兽的生命值减少p[i]-b[j],当然如果伤害小于防御,那么攻击就不会奏效

wtml 622

Android Bitmap和Drawable互转及使用BitmapFactory解析图片流

一、Bitmap转Drawable Bitmap bmp=xxx; BitmapDrawable bd=new BitmapDrawable(bmp); 因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。 二、 Drawable转Bitmap 转成Bitmap对象后,可以将Drawable对象通过Android的SK库存成一个字节输出流,最

suyan_why的博客 888
上一篇: AndroidStudio中给App改变包名。
下一篇: 安卓漫漫路之缓存策略.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值