Android---bitmap优化

目录

Bitmap 占用内存大小计算

Bitmap | Drawable | InputStream | Byte[] 之间进行转换

Bitmap 相关方法

BitmapFactory 工厂类


Bitmap 占用内存大小计算

Bitmap 作为位图,需要读入一张图片中每一个像素点的数据,其主要占用内存的地方也正是这些像素数据。对于像素数据总大小,我们可以猜想:像素总数量 * 每个像素的字节大小,而像素总数量在矩形屏幕表现下,应该是:横向像素数量 * 纵向像素数量,结合得到:

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

1920 * 1080 分辨率的图片,占多少内存?

1920 * 1080 占用内存 == 1920 * 1080 * 1个像素占用内存大小

1个像素占多少内存?

单个像素的字节大小由 Bitmap 的一个配置的参数 Config 来决定。

Bitmap 中,存在一个枚举类 Config,定义了 Android 中支持的 Bitmap 配置:

Config占用字节大小(Byte)说明
ALPHA_8(1)1单透明通道
RGB_565(3)2简易 RGB 色调
ARGB_4444(4)2已废弃
ARGB_8888(5)424位真彩色
RGBA_F16(6)8Android 8.0新增(更丰富的色彩表现HDR)
HARDWARESpecialAndroid 8.0新增(Bitmap 直接存储在 graphic memory)

Bitmap | Drawable | InputStream | Byte[] 之间进行转换

1. Drawable/mipmap 下图片转换为 Bitmap

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dp);
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.mipmap.dp);

2. Bitmap 转换为 Drawable

Drawable drawable = new BitmapDrawable(getResources(), bitmap1);

3. Bitmap 转换为 byte[]

ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] bytes = baos.toByteArray();

4. byte[] 转换为 Bitmap

Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

5. InputStream 转换成 Bitmap

InputStream is = getResources().openRawResource(id);
Bitmap bitmap = BitmapFactory.decodeStream(is);

6. InputStream 转换为 byte[]

InputStream is = getResources().openRawResource(id);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] b = new byte[1024 * 2];
int len = 0;

while ((len = is.read(b, 0, b.length)) != -1) {
     baos.write(b, 0, len);
     baos.flush();
}
byte[] bytes = baos.toByteArray();

Bitmap 相关方法

\bullet 判断位图内存是否已经释放

public final boolean isRecycled()

\bullet 获取位图的宽度

public final int getWidth()

\bullet 获取位图的高度

public final int getHeight()

\bullet 获取指定密度转换后的图像的宽度

public int getScaleWidth(Canvas canvas)

 \bullet 获取指定密度转换后的图像的高度

public int getScaleheight(Canvas canvas)

 \bullet 按指定的图片格式以及画质,将图片转换为输出流,即压缩图片

public boolean compress(CompressFormat format, int quality, OutputStream stream)

 \bullet 以 bitmap 为原图生成不可变得新图像,即创建新图

public static Bitmap createBitmap(Bitmap bitmap)

 \bullet 以 bitmap 为原图创建新的图像,指定新图像的宽高以及是否可变

public static Bitmap createScaledBitmap(Bitmap bitmap, int dstWidth, int dstHeight, boolean filter)

 \bullet 创建指定格式、大小的位图

public static Bitmap createBitmap(int width, int height, Config config)

 \bullet 以 bitmap 为原图,创建新的图片,指定起始坐标以及新图像的宽高

public static Bitmap createBitmap(Bitmap bitmap, int x, int y, int width, int height)

BitmapFactory 工厂类

1. Option 参数类

\bullet inJustDecodeBounds = true,不获取图片,不分配内存,但会会返回图片的高度信息。如果将这个值置为 true,那么在解码的时候将不会返回 bitmap,只会返回这个 bitmap 的尺寸。这个属性的目的是,如果你只想知道一个 bitmap 的尺寸,但又不想将其加载到内存时。这是一个非常有用的属性。

public boolean inJustDecodeBounds

\bullet inSampleSize 图片缩放的倍数,这个值是一个 int,当它小于 1 的时候,将会被当做 1 处理,如果大于 1,那么就会按照比例 1 / inSampleSize 缩小 bitmap 的宽和高,降低分辨率,大于 1 时这个值将会被处置为 2 的倍数。例如,width = 100, height = 100,inSampleSize = 2,那么就会将 bitmap 处理为,width = 50, height = 50,宽高将为 1/2, 像素数将为 1/4 (1/2 * 1/2).

public int inSampleSize

\bullet 获取图片的宽度值

public int outWidth

\bullet 获取图片的高度值,表示这个 Bitmap 的宽和高,一般和 inJustDecodeBounds 一起使用来获得 Bitmap 的宽高,但是不加载到内存。

public int outHeight

\bullet 用于位图的像素压缩比

public int inDensity

\bullet 用于目标位图的像素压缩比(要生成的位图)

public int inTargetDensity

\bullet 创建临时文件,将图片存储

public byte[] inTempStorage

\bullet 设置为 true 时进行图片压缩,从 inDensity 到 inTargetDensity

public boolean inScaled

\bullet 当存储 Pixel 的内存空间在系统内存不足时是否可以被回收

public boolean inPurgeable

\bullet 配置 Bitmap 是否可以更改,比如:在 Bitmap 上隔几个像素加一条线段

public boolean inMutable

\bullet 当前屏幕的像素密度

public int inScreenDensity

2. 工厂方法

\bullet 从文件读取图片

public static Bitmap decodeFile(String pathName, Options opts)
public static Bitmap decodeFile(String pathName)

\bullet 从输入流读取图片

public static Bitmap decodeStream(InputStream is)
public static Bitmap decodeStream(InputStream is, Rect outPadding, Options opts)

\bullet 从资源文件读取图片,res 参数直接输入 getResources() 

public static Bitmap decodeResource(Resources res, int id)
public static Bitmap decodeResource(Resources res, int id, Options opts)

\bullet 从数组读取图片

public static Bitmap decodeByteArray(byte[] data, int offset, int length)
public static Bitmap decodeByteArray(byte[] data, int offset, int length, Options opts)

\bullet 从文件读取文件,与 decodeFile 不同的是这个直接调用 JNI 函数进行读取,效率比较高

public static Bitmap decodeFileDescriptor(FileDescriptor fd)
public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/19256.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python进阶--月考二

python进阶--月考二 (一)装饰器(二)创建名为express.py文件,编写以下推导式(25分)(三)创建名为process_test.py的文件,计算1-3000之间的水仙花数(…

QT MD4 MD5 Sha1等几种加密方式

QT MD4 MD5 Sha1等几种加密方式 [1] QT MD4 MD5 Sha1等几种加密方式[2] qt MD5 和AES 加密一 、MD5 加密二、AES 加密和解密 [3] QT中sqlite数据库数据加密/混淆---MD5/SHA1/SHA2/SHA3(1)创建一个加密对象(2)放入要加密的数据&…

目前可用的ChatGPT网站

本文意在整理可用gpt-3.5、gpt-4.0等网站。 本文主要是方便自己翻阅,如对您也有所帮助,不胜荣幸~ 文章目录 chatgpt.qdymys.cngpttalkchatgpt-cn.cobing.comchat机器人wuguokai.cn总结 chatgpt.qdymys.cn 网址:https://chatgpt.qdymys.cn/限…

SpringCloud —— eureka

目录 1.认识微服务 1.0.学习目标 1.1.单体架构 1.2.分布式架构 1.3.微服务 1.4.SpringCloud 1.5.总结 2.服务拆分和远程调用 2.1.服务拆分原则 2.2.服务拆分示例 2.2.1.导入Sql语句 2.2.2.导入demo工程 2.3.实现远程调用案例 2.3.1.案例需求: 2.3.2.注…

mysql进阶-查询优化-慢查询日志

文章目录 一、什么是慢查询日志二、慢查询日志能干什么2.1 性能分析和优化2.2 诊断和排查问题2.3 数据分析和探索 三、慢查询日志实战3.1 永久开启开启慢查询日志3.2 临时开启慢查询日志3.4 常用命令 四、如何分析慢查询日志五、优化慢查询语句五、总结 一、什么是慢查询日志 …

观察者设计模式(Observer Design Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

文章目录 概念组成角色相关图示示例代码框架中的运用适用场景 概念 观察者设计模式(Observer Design Pattern)是一种行为型设计模式,它定义了一种对象间的一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当…

SpringBoot 配置文件

前言: 本篇主要介绍两种配置文件格式,分别为properties与yml(yaml)。 需要注意的是: 两个配置文件从功能上来讲是可以同时存在的,但是企业中通常会规定使用某一种格式的配置文件。如果同一个配置出现在两种格式的配置文件中的话&a…

微波方向有哪些SCI期刊推荐? - 易智编译EaseEditing

微波方向的SCI期刊推荐包括: IEEE Transactions on Microwave Theory and Technology: 该期刊是电磁场与微波技术领域的著名期刊,被世界上许多研究机构和大学广泛引用。 IEEE Transactions on Antennas and Propagation: 该期刊…

English Learning - L3 作业打卡 Lesson1 Day5 2023.5.9 周二

English Learning - L3 作业打卡 Lesson1 Day5 2023.5.9 周二 引言🍉句1: Fast loud music is popular with many people .成分划分爆破语调 🍉句2: They may say the music is red hot, especially the kind called Dixieland jazz.成分划分爆破语调 &a…

AI孙燕姿项目实现

最近在b站刷到很多关于ai孙笑川唱的歌曲,加上最近大火的ai孙燕姿, 这下“冷门歌手”整成热门歌手了 于是写下一篇文章, 如何实现属于的ai歌手。 注意滥用ai,侵犯他人的名誉是要承担法律责任的 下面是一些所需的文件链接&#xff…

低代码信创开发核心技术(一):基于Vue.js的描述依赖渲染DDR实现模型驱动的组件

前言 随着数字化转型的不断发展,低代码开发平台已成为企业快速建立自己的应用程序的首选方案。然而,实现这样一个平台需要具备高效、灵活和可定制化的能力。这正是基于描述依赖渲染(Description dependency rendering)所实现的。…

C语言CRC-16 XMODEM格式校验函数

C语言CRC-16 XMODEM格式校验函数 CRC-16校验产生2个字节长度的数据校验码,通过计算得到的校验码和获得的校验码比较,用于验证获得的数据的正确性。基本的CRC-16校验算法实现,参考: C语言标准CRC-16校验函数。 不同应用规范通过对…

三分钟阿里云服务器u1通用算力型性能、使用限制及费用说明

阿里云服务器u1是通用算力型云服务器,CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器,通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xff0c…

C/C++每日一练(20230512) 成绩打印、补齐数组、水仙花数

目录 1. 成绩打印 ※ 2. 按要求补齐数组 🌟🌟🌟 3. 水仙花数 ※ 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 成绩打印 一个班有10个同学&am…

隐语v0.8.2版本更新,首次发布TEEU

隐语v0.8.2版本更新🌟 应用层 机器学习: - MPC 纵向 LR (SSRegression)新增 Policy SGD 优化器和 Early Stopping 支持,减少调参成本,加快收敛速度; - WOE 分箱进行了若干优化,性…

本地搭建wamp服务器并内网穿透实现无公网IP远程访问

文章目录 前言1.Wamp服务器搭建1.1 Wamp下载和安装1.2 Wamp网页测试 2. Cpolar内网穿透的安装和注册2.1 本地网页发布2.2 Cpolar云端设置2.3 Cpolar本地设置 3. 公网访问测试4. 结语 转载自cpolar极点云的文章:无公网IP?教你在外远程访问本地Wamp服务器「…

前端CSS学习(三)

1、盒子模型 盒子的概念1、页面中的每一个标签,都可看做是一 个“盒子” ,通过盒子的视角更方便的进行布局2、浏览器在渲染 (显示)网页时,会将网页中的元素看做是一个个的矩形区域,我们也形象的称之为盒子CSS中规定每个盒子分别由…

Postman安装及入门接口测试使用步骤

前言 在软件测试行业中,作为一款比jemter更便捷更好用的软件测试工具,postman以其便捷灵活性首当其冲,成为当今测试行业领域使用较广泛的主流系统软件接口测试工具。今天Darren洋为大家讲解postman这款软件测试工具的下载安装及入门接口测试步…

Linux权限 - 概念与管理 | 文件权限的修改与转让 【详解】

目录 Linux权限 Linux权限的概念 Linux权限的基础操作 (1).实现用户账号的切换 (2).仅提升当前指令的权限 Linux权限管理 1、文件访问者的分类(人) 2、文件类型和访问权限(事物属性) 3、文件权限值的表示方法 4、文件访…

刷题刷题。

自然数拆分 利用step记录组合情况,只用sum不能判断组合情况 1.选择dfs原因:产生排列组合,和为7,step为8,其中7个空位,第8个step为输出; 参量的设置sum,step (进入下一层)…