Android---bitmap优化

news2024/11/15 9:42:26

目录

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)

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【axios 使用】下载文件流 以及 获取响应头header content-disposition

获取数据都知道,使用的是 axios,主要是设置 responseType: blob 由于项目使用的是 apipost ,所以在使用的时候还要设置 isReturnNativeResponse -是否返回本机响应标头,一般可能设置 responseType: blob 就可以了 export function getDow…

本地使用IIS快速搭建一个属于自己的网站,并发布公网访问「无需购买云服务器」

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中,搭建网页都会借助各种软件的帮助&#xf…

java+iClientOpenlayers实现城市内涝积涝模拟内涝模拟演进

程序实现效果图 洪水演进过程 一、应用背景 城市内涝和积涝是一个严重的问题,特别是在气候变化的背景下。为了更好地了解这个问题,模拟城市内涝和积涝是非常重要的。这个过程可以帮助我们预测哪些区域可能会受到影响,以及在发生内涝和积涝时…

人人都应该知道的CPU缓存运行效率

提到CPU性能,大部分同学想到的都是CPU利用率,这个指标确实应该首先被关注。但是除了利用率之外,还有很容易被人忽视的指标,就是指令的运行效率。如果运行效率不高,那CPU利用率再忙也都是瞎忙,产出并不高。 …

“LSTM之父”谈AI威胁论:AI将超越人类智力,对人类不感兴趣,呼吁暂停AI是一种误导

他因在人工智能(AI)、深度学习和人工神经网络领域内做出的成就而知名,一度被称为“(现代)AI 之父”或“深度学习之父”。 他提出的长短期记忆网络(LSTM)被谷歌、苹果、亚马逊、Meta 等科技巨头…

Ims跟2/3G会议电话(Conference call)流程差异介绍

2/3G Conference call 合并(Merged)通话前,两路电话只能一路保持(Hold),一路通话(Active)。 主叫Merged操作,Hold的一路会变成Active,进入会议通话。 例如终端A跟C通话,再跟B通话,此时B就是Active状态,C从Active变成Hold状态。Merged进入会议通话后,C又从Hold变…

亚马逊关于婴儿摇篮的政策需要做的认证标准

本政策适用的婴儿摇篮 婴儿摇篮 婴儿摇篮是一种旨在为婴儿提供睡眠环境的小床。婴儿摇篮由独立支腿、固定框架或支腿、轮式底座、摇摆底座或可以相对于固定底座摇摆的底座支撑。在静止(不摇摆或不摆动)时,婴儿摇篮的睡眠表面与水平面的夹角…

ASEMI代理ADI亚德诺LT6230CS6-10#TRPBF车规级芯片

编辑-Z LT6230CS6-10#TRPBF特点: 低噪声电压:1.1nV/ √Hz 低电源电流:3.5mA/Amp(最大值) 低失调电压:350μV(最大值) 增益带宽积: LT6230:215MHz&#…

设计模式之【桥接模式】,多用组合少用继承

文章目录 一、什么是桥接模式1、使用场景2、代理、桥接、装饰器、适配器 4 种设计模式的区别3、桥接模式的优缺点4、桥接模式的四种角色 二、实例桥接模式优化代码 三、源码中使用的桥接模式1、桥接模式在JDBC中的应用 一、什么是桥接模式 桥接模式(Bridge Pattern…

【Java 并发编程】Java 线程本地变量 ThreadLocal 详解

Java 线程本地变量 ThreadLocal 详解 1. ThreadLocal 简介2. ThreadLocal 的使用2.1 ThreadLocal 接口(1)initialValue()(2)get()(3)set(T value)(4)remove() 2.2 ThreadLocal 应用 …

springboot链接redis (Windows版本)

1。 下载链接 https://redis.io/download/ 2.下载完成之后傻瓜安装 3. 打开下载安装路径 3.输入cmd回车 4.依次执行以下命令 redis-server.exe redis-server.exe redis.windows.conf redis-cli shutdown exit redis-server.exe redis.windows.conf 可成功启动redis 5…

(五)Kubernetes - 手动部署(二进制方式安装)

Kubernetes - 手动部署 [ 4 ] 1 增加Master节点(高可用架构)1.1 部署Master2 Node1.1.1 安装Docker(Master1)1.1.2 启动Docker、设置开机自启(Master2)1.1.3 创建etcd证书目录(Master2)1.1.4 拷贝文件(Master1)1.1.5 删除证书(Master2)1.1.6 修改配置文件和主机名(Master2)1.1.…

在线一键解jsjiami.v6

在当今的互联网时代,JavaScript是web开发的核心技术之一。但是,为了保护JavaScript代码的安全性,很多开发者会使用JS加密技术。其中一个常用的JS加密工具是jsjiami.v6。 JS加密通过对JavaScript代码进行混淆、压缩、编码等多种操作&#xff…

使用crond定时跑脚本备份数据库

前言: 开发环境 服务器:centos 7(腾讯云轻量服务器) 数据库:mysql 5.7 一、crond是什么? crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务…

车载测试-can报文解析规则实例

报文解析 报文组成 一般报文主要有以下几个参数(比较全的情况下) 例 解析报文时主要用到的是帧ID和帧数据 帧ID 接收到的帧ID是十六进制的形式,由29位标识符转换的,目前大多数的通信协议中都直接给出了相应的帧ID&#xff0c…

一文读懂ChatGPT(全文由ChatGPT撰写)

最近ChatGPT爆火,相信大家或多或少都听说过ChatGPT。到底ChatGPT是什么?有什么优缺点呢? 今天就由ChatGPT自己来给大家答疑解惑~ 全文文案来自ChatGPT! 01 ChatGPT是什么 ChatGPT是一种基于人工智能技术的自然语言处理系统&…

光耦继电器和普通继电器的区别概述

光耦继电器和普通继电器都是电气传感器元件中的一种,其都能够将电能转化成机械能,并实现各种开关控制和保护控制。但光耦继电器与普通继电器最大的区别在于其输入电路与输出电路之间通过光电转换器件,而不是实现物理接触。本文将从结构、工作…

为什么越来越多的设计师开始用云渲染来渲图?

为什么越来越多的设计师开始使用 云渲染?小编认为可以从设计师以及云渲染平台自身这2个方向分析,下面一起阅读云渲染干货~ 一.针对于设计师 1.出图多,电脑供不应求 绘图员制作完后需要渲染给甲方确认,甲方要求多的又着急的话边改…

MySQL---基本查询DQL(下)(排序查询、聚合查询、分组查询、分页查询、正则表达式)

1. 排序查询 语法: select 字段名1,字段名2,…… from 表名 order by 字段名1 [asc|desc],字段名2[asc|desc]……注意:asc代表升序,desc代表降序,如果不写默认升序 order by用于子句中可以支持…

CM211-1-ZG_S905L 3-B_当贝纯净桌面-线刷固件包

CM211-1-ZG_S905L 3-B_当贝纯净桌面-线刷固件包-内有教程及短接点 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件&…