Android Bitmap压缩

Android-Bitmap压缩策略 在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。 阅读详情

在Android中,如果加载过大的Bitmap,可能会造成OOM,所以在加载之前,有必要对其进行压缩处理。
Bitmap压缩大概有两种方式:质量压缩和尺寸压缩。

质量压缩

/**
 * bitmap : 要压缩的Bitmap
 * options: 质量参数,0 - 100,值越小,图片压缩越厉害,清晰度越低
 */
public static void compress(Bitmap bitmap, int options) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);
    try {  
        FileOutputStream fos = new FileOutputStream(file);  
        fos.write(baos.toByteArray());  
        fos.flush();  
        fos.close();  
    } catch (Exception e) {  
        e.printStackTrace();  
    }
}

通过降低图片的质量达到压缩图片,图片像素点个数不会变,改变的是图片位深及透明度等。

还有一种办法可以降低图片质量的,通过改变BitmapOption的色彩模式:

public static void compressBitmap(String filePath, File file) {
    BitmapFactory.Options options = new BitmapFactory.Options();
    // 默认是ARGB_8888,如果是jpg的话,可以使用RGB_565模式,降低每个像素点占有的内存
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);  
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.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提供的BitmapOption类对Bitmap进行尺寸压缩。先对BitmapOption的几个属性进行了解:

inJustDecodeBounds:
如果将这个值置为true,那么在解码的时候将不会返回bitmap,只会返回这个bitmap的尺寸。这个属性的目的是,如果你只想知道一个bitmap的尺寸,但又不想将其加载到内存时。这是一个非常有用的属性。

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。

inPreferredConfig:
这个值是设置色彩模式,默认值是ARGB_8888,在这个模式下,一个像素点占用4bytes空间,一般对透明度不做要求的话,一般采用RGB_565模式,这个模式下一个像素点占用2bytes。

色彩模式:
ALPHA_8
表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度
ARGB_4444
表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节
ARGB_8888
表示32位ARGB位图,即A=8,R=8,G=8,B=8,一个像素点占8+8+8+8=32位,4个字节
RGB_565
表示16位RGB位图,即R=5,G=6,B=5,它没有透明度,一个像素点占5+6+5=16位,2个字节

其中,A代表透明度;R代表红色;G代表绿色;B代表蓝色。

public static void compressBitmap(String filePath, File file) {
    int inSampleSize = 2;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = inSampleSize;
    Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);  
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.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();  
    } 
}

另外我自己写了一个关于Bitmap压缩的库,请参考Android 打造Bitmap压缩工具库。

Android Bitmap压缩策略 一、为什么Bitmap需要高效加载? 现在的高清大图,动辄就要好几M,而Android对单个应用所施加的内存限制,只有 小几十M,如16M,这导致加载Bitmap的时候很容易出现内存溢出。如下异常信 息,便是在开发中经常需要的: java.lang.OutofMemoryError:bitmap size exceeds VM budget 为了解决这个问题,就出现了Bitmap的高效加载策略... 阅读详情

相关推荐

android bitmap 无损压缩,详解Bitmap尺寸压缩与质量压缩

转载请注明出自flowsky37的博客,尊重他人辛苦劳动!在Android系统中,关于图片处理的是一个既常见又比较棘手的问题。一个应用中,存在需要展示大量的图片的布局,那我们必须要小心翼翼的处理了,不然OOM会就像一个定时炸弹一样出现。由于大量位图加载导致的内存溢出是Android中内存溢出常见场景之一。关于图片的处理,一般情况下就是要对bitmap进行合适的处理跟优化。在Android应用中,图...

weixin_31782323的博客 2658

Android bitmap压缩方法

Bitmap所占用的内存 = 图片长度 x 图片宽度 x 一个像素点占用的字节数。3个参数,任意减少一个的值,就达到了压缩的效果。

fenglolo的博客 2788

深入解析CycloneDDS跨域通信中的XML配置文件优化策略

本文深入解析了CycloneDDS跨域通信中XML配置文件的优化策略,重点介绍了网络接口配置、多播设置、性能调优参数及复杂场景下的配置案例。通过实战技巧和调试方法,帮助开发者在SoC环境中实现高效稳定的跨域通信,提升系统性能。

soda5的博客 688

图像系列:Bitmap:硬核 Android 中 Bitmap压缩的几种方法

决定Bitmap图片大小或者解码之后内存取决于:图片透明度,位深,图片采样率(分辨率),编码格式,图片本身宽高,下面我们围绕这几个因素来研究下 1:质量压缩法(改变图片位深和透明度) 1.1 :理论说明 所谓质量压缩法:不减少图片本身的像素,它在保持像素的前提下该变图片的位深以及透明度,来达到压缩图片的目的,压缩后的文件大小会有所改变,但是导入成 bitmap后所占内存是不会变化的,由于要保持像素不变,所以它无法无限压缩,达到一个极限值后就不会继续变小了。 所以这个方法,不适合缩略图,也不适合想通过

C++ JAVA的专栏 6763

STM32与小米CyberGear微电机的CAN通信协议深度解析

本文深度解析STM32与小米CyberGear微电机的CAN通信协议,涵盖硬件连接、CAN总线配置、通信协议解析及多电机协同控制。重点介绍了基于STM32的电机控制实践,包括运动模式、速度与位置模式设置,以及数据反馈与故障诊断,为机器人及自动化设备开发提供实用指南。

www00的博客 359

使用MLP解决OCR问题(OpenCV)(下)

分类模型:        分类模型涉及的一个比较关键的问题就是输出的10维向量是如何与具体的类别挂钩的。实际上:10维向量的每一位都代表一类,在对于训练集的表达中,如果输入数据是0,则10维向量的第一位赋值为1,其余均为0。即0对应[1,0,0,0,0,0,0,0,0,0]。MLP模型训练完成后,就需要对用户输入的数据所属类别进行判定。这时得到的输出数据基本不可能是正好的所属类为1,其他位置为0

qq_18515405的专栏 1906

bitmap的六种压缩方式,Android图片压缩

bitmap的六种压缩方式,图片压缩 形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小计算方式:图片长度 x 图片宽度 x 一个像素点占用的字节数以下是图片的压缩格式:其中,A代表透明度;R代表红色;G代表绿色;

HarryWeasley的专栏 6万+

YOLOv5实战:无人机巡检图片差异对比与违建标记(附完整代码)

本文详细介绍了如何利用YOLOv5目标检测技术实现无人机巡检图片差异对比与违建标记。通过图像对齐、目标检测、差异分析和可视化标记四个步骤,构建高效的违建识别系统,显著提升城市管理效率。文章包含完整代码实现和性能优化技巧,为计算机视觉在无人机巡检中的应用提供实用指南。

weixin_42535720的博客 280

bitmap xml大小 安卓_Android bitmap压缩方法

明人不说暗话,开门见山地说Bitmap所占用的内存 = 图片长度 x 图片宽度 x 一个像素点占用的字节数。3个参数,任意减少一个的值,就达到了压缩的效果。所以压缩又可以分为两种方法,质量压缩和宽高压缩1.质量压缩bitmap.compress(Bitmap.CompressFormat.JPEG, quality, byteArrayOutputStream );主要是通过设置quality来降...

weixin_36261385的博客 425

ArcMap投影变换避坑指南:为什么你的坐标转换总出错?常见问题解析与解决方案

本文深入解析ArcMap中坐标转换与投影变换的核心区别与常见陷阱。针对坐标转换总出错的问题,从混淆“定义投影”与“投影变换”、栅格数据重采样选择、矢量数据地理变换参数设置等关键环节,提供清晰的避坑指南与实战解决方案,帮助用户确保空间数据的精确匹配。

weixin_29210727的博客 356

tun虚拟网卡没有安装解决之道

目录 描述 过程 一、sstap 会提示你虚拟网卡没有安装; 二、还有会是这样的:病毒和威胁防护中无法启动;引擎不可以用等等,以及会显示需要IT管理员去处理;等等报错的信息; 系统升级地方会显示:Windows Defender Antivirus 的安全智能更新 - KB2267602 (版本 1.305.2147.0) - 错误 0xc8000442 Windows Defender报错; 三、还有就是会出现你搜自己家的WIFI搜不到,电脑端都不会显示WIFI名字; 解决方...

战神/calmness的博客 1万+

【安卓学习积累】Android Bitmap压缩图片

本文主要介绍如何使用Bitmap压缩高清图片。 如果我们使用Bitmap加载高清图片很容易造成OOM,同时在很多时候,我们可以对这种高清图片进行压缩。主要使用到的是BitmapFactory.Options。 一、代码段 BitmapFactory.Options options = getBitmapFactory(R.drawable.ceshi, 500, 400); img.set...

xiangzaixiansheng的博客 442

【Bug已解决】Claude Team Plan 购买席位报错 Payment failed 解决方案

方案适用场景推荐指数检查账单历史状态排查的第一步⭐⭐⭐⭐⭐更换支付方式类型快速尝试是否能绕开问题⭐⭐⭐联系官方支持团队最终解决问题的正规渠道⭐⭐⭐⭐⭐临时过渡方案紧急用人需求的应急处理⭐⭐⭐关注官方修复进度确认属于系统性缺陷的场景⭐⭐⭐⭐Claude Team Plan 增购席位报的问题,社区反馈和实际排查表明很大概率属于平台计费系统在处理按比例分摊费用这类复杂计算链路时的系统性缺陷,而不是用户自身的支付信息填写有误。先排除自身账单历史是否存在异常。

一键难忘的博客 4179

bitmap xml大小 安卓_[Android算法] bitmap 将图片压缩到指定的大小

Bitmap压缩到指定大小:private void imageZoom() {//图片允许最大空间 单位:KBdouble maxSize =400.00;//将bitmap放至数组中,意在bitmap的大小(与实际读取的原文件要大)ByteArrayOutputStream baos = new ByteArrayOutputStream();bitMap.compress(Bitmap.Co...

weixin_39931923的博客 319

Test软件:Keysight二次开发_(1).Keysight软件开发概述

VISA(Virtual Instrument Software Architecture)库是Keysight提供的一种标准化的仪器控制接口,支持多种编程语言和开发环境。仪器通信:通过GPIB、USB、以太网等接口与仪器进行通信。数据采集:从仪器中获取测量数据。命令发送:向仪器发送控制命令。错误处理:处理通信过程中可能出现的错误。测试自动化是指通过编写脚本或程序来自动执行测试任务,从而提高测试效率和减少人为错误。Keysight的测试设备和仪器支持多种编程语言和开发环境,使得测试自动化变得相对容易。

2401_87715305的博客 1356

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android BitMap图片压缩

参考链接: bitmap的六种压缩方式,Android图片压缩 这篇文章对概念讲述的挺好的 Bitmap.Config ARGB_4444:每个像素占四位,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位,是2个字节 Bitmap.Config ARGB_8888:每个像素占四位,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位,是4个字节 ...

谢耀眼 1159

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

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

Android Bitmap压缩的正确姿势

Android开发中经常有如下需求: 1.由file decode bitmap 如果硬盘中的图片文件过大,不进行压缩,直接decode到内存,会有内存溢出的风险。 可利用BitmapFactory.Options设置inSampleSize(采样率)即可。 计算采样率,通常缩小图片的宽或者高(减少像素点,图片内容完整,如果减少得过分了,图片文件会模糊)为原来的1/2、1/4、1/8,就是缩放2的...

奋斗的IT青年 7174

visio安装包

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android Bitmap的常用压缩方式

一、前言 已经好久没有更新博客,大概有半年了,主要是博主这段时间忙于找工作,Android岗位的工作真的是越来越难找,好不容易在广州找到一家,主要做海外产品,公司研发实力也不错,所以就敲定了三方协议。现在已经在公司实习了一个月多,目前主要是负责公司某个产品的内存优化,刚好就总结了一下Android Bitmap常用的优化方式。 Android中的图片是以Bitmap方式存在的,绘制的时候也是B...

淡淡的宁静的博客 1168

Android Bitmap 质量压缩原理与压缩机制详解

问题: Bitmap 的质量压缩原理回答Android 的质量压缩是通过方法实现的有损压缩。它调整图片的编码质量参数(0-100),主要作用于 JPEG/WEBP 格式。其核心原理是:对色彩数据进行离散余弦变换(DCT),分离高频/低频分量通过量化表降低高频细节(人眼不敏感部分)的精度使用哈夫曼编码压缩数据块这种压缩会减小文件体积,但不改变图片尺寸,解码后内存占用不变,适合网络传输场景。问题:Bitmap 有哪些压缩方式?

qq_45906596的博客 1482

Android压缩Bitmap

这两天在做的一个app对图片进行压缩,踩了几个坑,这里记录一下。百度上很多解决方案使用Bitmap.compress()方法来进行图片压缩:OutputStream out = new FileOutputStream(file); bm.compress(Bitmap.CompressFormat.JPEG, 80, out); imageView.setImageBitmap(bm);

大丧失的专栏 968

android 关于Bitmap压缩处理解析

在开发过程中,我们或多或少的都会接触到Bitmap这个东西,用的不好的话就会出现OOM问题,同时,也会有压缩的需求,所以今天就来理一理关于Bitmap的一些内容。 关于Bitmap的Config的理解 A:透明度 R:红色 G:绿 B:蓝 /** * Possible bitmap configurations. A bitmap configuration desc

ostracod 1475

Android的Bitmap的压缩使用

1.尺寸压缩: 就Android Bitmap面面观|杰风居 该链接的Bitmap详情说的很清晰,建议了解一下。 这篇文章说的,使用Bitmap节省内存最重要的技巧就是加载合适大小的缩略图,需要先读取Bitmap的原始大小并且设置inJustDecodeBounds ,按缩小了合适的倍数的大小Bitmap进行加载。 public static Bitmap decodeSampledBi...

Mocarcher的博客 1075
上一篇: Android 缓存 - DiskLruCache
下一篇: Android 打造Bitmap压缩工具库
JohanMan
博客等级 码龄10年 72粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值