Android之图片压缩几种方式

大概可以分为以下几类:更换图片格式,质量压缩,采样率压缩,缩放压缩,调用jpeg压缩等

1.设置图片格式

Android目前常用的图片格式有png,jpeg和webp,
png无损压缩图片格式,支持Alpha通道,Android切图素材多采用此格式
jpeg:有损压缩图片格式,不支持背景透明,适用于照片等色彩丰富的大图压缩,不适合logo
webp:是一种同时提供了有损压缩和无损压缩的图片格式,派生自视频编码格式VP8,从谷歌官网来看,无损webp平均比png小26%,有损的webp平均比jpeg小25%~34%,无损webp支持Alpha通道,有损webp在一定的条件下同样支持,有损webp在Android4.0(API 14)之后支持,无损和透明在Android4.3(API18)之后支持
采用webp能够在保持图片清晰度的情况下,可以有效减小图片所占有的磁盘空间大小

2.质量压缩

质量压缩并不会改变图片在内存中的大小,仅仅会减小图片所占用的磁盘空间的大小,因为质量压缩不会改变图片的分辨率,而图片在内存中的大小是根据widthheight一个像素的所占用的字节数计算的,宽高没变,在内存中占用的大小自然不会变,**质量压缩的原理是通过改变图片的位深和透明度来减小图片占用的磁盘空间大小,所以不适合作为缩略图,可以用于想保持图片质量的同时减小图片所占用的磁盘空间大小。**另外,由于png是无损压缩,所以设置quality无效,以下是实现方式:

    /*** 质量压缩** @param format  图片格式 jpeg,png,webp* @param quality 图片的质量,0-100,数值越小质量越差*/public static void compress(Bitmap.CompressFormat format, int quality) {File sdFile = Environment.getExternalStorageDirectory();File originFile = new File(sdFile, "originImg.jpg");Bitmap originBitmap = BitmapFactory.decodeFile(originFile.getAbsolutePath());ByteArrayOutputStream bos = new ByteArrayOutputStream();originBitmap.compress(format, quality, bos);try {FileOutputStream fos = new FileOutputStream(new File(sdFile, "child.jpg"));fos.write(bos.toByteArray());fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

3.采样率压缩

采样率压缩是通过设置BitmapFactory.Options.inSampleSize,来减小图片的分辨率,进而减小图片所占用的磁盘空间和内存大小。
设置的inSampleSize会导致压缩的图片的宽高都为1/inSampleSize,整体大小变为原始图片的inSampleSize平方分之一,当然,这些有些注意点:
1、inSampleSize小于等于1会按照1处理
2、inSampleSize只能设置为2的平方,不是2的平方则最终会减小到最近的2的平方数,如设置7会按4进行压缩,设置15会按8进行压缩。
具体的代码实现方式如下:

    /*** @param inSampleSize 可以根据需求计算出合理的inSampleSize*/public static void compress(int inSampleSize) {File sdFile = Environment.getExternalStorageDirectory();File originFile = new File(sdFile, "originImg.jpg");BitmapFactory.Options options = new BitmapFactory.Options();//设置此参数是仅仅读取图片的宽高到options中,不会将整张图片读到内存中,防止oomoptions.inJustDecodeBounds = true;Bitmap emptyBitmap = BitmapFactory.decodeFile(originFile.getAbsolutePath(), options);options.inJustDecodeBounds = false;options.inSampleSize = inSampleSize;Bitmap resultBitmap = BitmapFactory.decodeFile(originFile.getAbsolutePath(), options);ByteArrayOutputStream bos = new ByteArrayOutputStream();resultBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);try {FileOutputStream fos = new FileOutputStream(new File(sdFile, "resultImg.jpg"));fos.write(bos.toByteArray());fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

4.缩放压缩

通过减少图片的像素来降低图片的磁盘空间大小和内存大小,可以用于缓存缩略图
实现方式如下:

    public void compress(View v) {File sdFile = Environment.getExternalStorageDirectory();File originFile = new File(sdFile, "originImg.jpg");Bitmap bitmap = BitmapFactory.decodeFile(originFile.getAbsolutePath());//设置缩放比int radio = 8;Bitmap result = Bitmap.createBitmap(bitmap.getWidth() / radio, bitmap.getHeight() / radio, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(result);RectF rectF = new RectF(0, 0, bitmap.getWidth() / radio, bitmap.getHeight() / radio);//将原图画在缩放之后的矩形上canvas.drawBitmap(bitmap, null, rectF, null);ByteArrayOutputStream bos = new ByteArrayOutputStream();result.compress(Bitmap.CompressFormat.JPEG, 100, bos);try {FileOutputStream fos = new FileOutputStream(new File(sdFile, "sizeCompress.jpg"));fos.write(bos.toByteArray());fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

5.其他

在缩放压缩的时候,可通过Bitmap.createBitmap(bitmap.getWidth() / radio, bitmap.getHeight() / radio, Bitmap.Config.ARGB_8888),如果不需要图片的透明度,可以将ARGB_8888改成RGB_565,这样之前每个像素占用4个字节,现在只需要2个字节,节省了一半的大小。

总结

1、使用webp格式的图片可以在保持清晰度的情况下减小图片的磁盘大小,是一种比较优秀的,google推荐的图片格式
2、质量压缩可以减小图片占用的磁盘空间,不会减小在内存中的大小
3、采样率压缩可以通过改变分辨率来减小图片所占用的磁盘空间和内存空间大小,但是采样率只能设置2的n次方,可能图片的最优比例在中间
4、尺寸压缩同样也是通过改变分辨率来减小图片所占用的磁盘空间和内存空间大小,缩放的尺寸没有限制

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

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

相关文章

【Java】新手一步一步安装 Java 语言开发环境

文章目录 一、Windows 10 系统 安装 JDK8二、 Mac 系统 安装 JDK8三、IDEA安装 一、Windows 10 系统 安装 JDK8 (1)打开 JDK下载网站,根据系统配置选择版本,这里选择windows 64位的版本,点击下载(这里需要…

5.SpringSpringBoot八股

Spring,Spring MVC,Spring Boot 之间什么关系? Spring就是整个Spring框架的整体,包含AOP、JDBC、Spring MVC等等模块 SpringBoot是Spring的精简版,它在Spring的基础上添加了自动装配、内置tomcat服务器等功能,使得代码量更少,同…

Finetuning vs. Prompting:大语言模型两种使用方式

目录 前言1. 对于大型语言模型的两种不同期待2. Finetune(专才)3. Prompt(通才)3.1 In-context Learning3.2 Instruction-tuning3.3 Chain of Thought(COT) Prompting3.4 用机器来找Prompt 总结参考 前言 这里和大家分享下关于大语言模型的两种使用方式,一种是 Fine…

2024最新 PyCharm 2024.1 更新要点汇总

2024最新 PyCharm 2024.1 更新要点汇总 文章目录 2024最新 PyCharm 2024.1 更新要点汇总摘要引言 Hugging Face:模型和数据集的快速文档预览针对 JavaScript 和 TypeScript 的全行代码补全 PyCharm Professional编辑器中的粘性行编辑器内代码审查新终端 Beta新的 AI…

ip连接检测

1.在C#中,你可以使用Socket类来检测IP连接是否正常。以下是一个简单的示例代码,演示了如何使用Socket类来检测IP连接的可用性: using System; using System.Net; using System.Net.Sockets;class Program {static void Main(string[] args){…

js+网络摄像头实现人体肢体关键点动作捕获

最近有一个项目,客户需要用户人体姿势识别,进行表演考核用途,或者康复中心用户恢复护理考核,需要用摄像头进行人体四肢进行肢体关键点对比考核,资料还是太少了。只有个别大佬发了部分技术指导。感觉写的不错。 阿里云…

【微信小程序——案例——本地生活(列表页面)】

案例——本地生活(列表页面) 九宫格中实现导航跳转——以汽车服务为案例(之后可以全部实现页面跳转——现在先实现一个) 在app.json中添加新页面 修改之前的九宫格view改为navitage 效果图: 动态设置标题内容—…

PTA(题目集三 题目 代码 C++ 注解)

目录 题目一: 代码: 题目二: 代码: 题目三: 代码: 题目四: 代码: 题目五: 代码: 题目六: 代码: 题目七: 代码…

【QT+QGIS跨平台编译】161:【qgispython跨平台编译】—【qgis_python.h生成】

点击查看专栏目录 文章目录 一、qgis_python.h介绍二、信息分析三、qgis_python.h生成一、qgis_python.h介绍 qgis_python.h 是 QGIS(Quantum Geographic Information System)GIS 软件的一个头文件。QGIS 是一个开源的地理信息系统软件,提供了丰富的地图制图和空间分析功能。…

第四百五十九回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容,本章回中将介绍如何获取时间戳.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

Arduino IDE开发esp8266,如何调试

在Arduino IDE中开发ESP8266时,调试通常需要依赖于串行输出(Serial.print 语句)和LED指示灯。由于ESP8266没有像一些高级开发平台那样的内置调试功能(例如JTAG或SWD接口),所以调试可能较为基础。以下是一些用于Arduino IDE中ESP8266开发调试的基本步骤: 环境准备:首先,…

一款绿联VGA转HDMI转换器MS9288A方案

实物 该转换器在后备箱放了一段时间,就成这个样子了,当然,后备箱也比较恶劣,堪比盐雾试验,因为有瓶稀盐酸倒了,发现不及时,一个新的转换器就成这个样子了。 VGA转HDMI转换器VGA输入插头 VGA转…

Go语言中常见的JSON处理错误

1. 由嵌入式字段导致的非预期行为 在下面的例子中,我们创建一个Event结构体,其包含一个ID和一个嵌入式的时间戳: type Event struct {ID inttime.Time } 由于 time.Time 是嵌入式的,因此我们可以直接通过Event来访问 time.Time 方法,比如event.Second( )。 嵌入式字段…

【Leetcode|#88.合并两个有序数组】

题目 给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数 m 和 n ,分别表示nums1和nums2中的元素数目。 请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。 注意:最终,合并后数组不应由函数返…

嵌入式MCU BootLoader开发配置详细笔记教程

目录 一、BootLoader基础 二、BootLoader原理及配置 三、BootLoader程序 bootloader.h bootloader.c 四、Application1 用户程序 application1.h application1.c 五、Application2 用户程序 application2.h 六、程序运行效果 七、工程文件Demo 一、BootLoader基础 …

HTTP Keep-Alive的作用

作用:Keep-Alive:使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时, Keep-Alive功能避免了建立或者重新建立连接。Web服务器,基本上都支持HTTP Keep- Alive。 缺点:对于提供静态内容的网站来…

Unity 中消息提醒框

Tooltip 用于ui布局 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; using UnityEngine.UI;[ExecuteInEditMode()] // 可以在编辑模式下运行public class Tooltip : MonoBehaviour {public TMP_Text header; // 头部文本publi…

MCU最小系统的电源模块设计和复位模块的设计

最小操作系统就是一个电路,这个电路里面必须要的东西(如人需要喝水吃饭温度等情况,才能或者) 现在我们要解决这三个问题 这里V开头的,都是电源管脚 这里解释一下: 这里要注意哪些是电路电压,哪…

简历上写熟悉Linux下常用命令?直接寄

大家写简历技术栈时,都觉得越多越好,其中一条,熟悉Linux下常用命令?其实开发中Linux不是必备考点,除了运维,真正用的多的仅仅cd ls mkdir等,但当面试官问到上面命令时,是不是就傻眼了…

Android14音频进阶之Perfetto高级调试技巧(六十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…