-
2020-07-23 11:46:20
开发中会有用户头像上传的需求,为了节省流量,一般上传接口都会限制图片大小,比如1M。但是随着手机像素越来越高,这个限制很容易达到,所以需要客户端在上传图片进行压缩操作。
先说一下思路:主要是等比缩小图片文件,辅之使用Bitmap#compress进行压缩。
①第一步根据文件路径创建File对象,然后判断File对象的大小
,如果大于1M,就开始压缩操作;
②接着通过BitmapFactory.Options
获取图片文件的宽高,先把图片宽高减半;然后根据缩小后的宽高创建新的Bitmap对象,这里通过Canvas将图像数据写到新的Bitmap中;接着利用Bitmap#compress方法将新Bitmap的数据写入到ByteArrayOutputStream中。
③接着判断ByteArrayOutputStream的size大小,如果还是超出目标大小,就继续将图片的宽高减半,重复执行步骤②。
④压缩完毕后将ByteArrayOutputStream写入到文件中即可。话不多说,直接上代码:
/** * 压缩图片到目标大小以下 * * @param file * @param targetSize */ public void compressBmpFileToTargetSize(File file, long targetSize) { Log.d(TAG, String.format("compressBmpFileToTargetSize start file.length():%d", file.length())); if (file.length() > targetSize) { // 每次宽高各缩小一半 int ratio = 2; // 获取图片原始宽高 BitmapFactory.Options options = new BitmapFactory.Options(); Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options); int targetWidth = options.outWidth / ratio; int targetHeight = options.outHeight / ratio; // 压缩图片到对应尺寸 ByteArrayOutputStream baos = new ByteArrayOutputStream(); int quality = 100; Bitmap result = generateScaledBmp(bitmap, targetWidth, targetHeight, baos, quality); // 计数保护,防止次数太多太耗时。 int count = 0; while (baos.size() > targetSize && count <= 10) { targetWidth /= ratio; targetHeight /= ratio; count++; // 重置,不然会累加 baos.reset(); result = generateScaledBmp(result, targetWidth, targetHeight, baos, quality); } try { FileOutputStream fos = new FileOutputStream(file); fos.write(baos.toByteArray()); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } } Log.d(TAG, String.format("compressBmpFileToTargetSize end file.length():%d", file.length())); } /** * 图片缩小一半 * * @param srcBmp * @param targetWidth * @param targetHeight * @param baos * @param quality * @return */ private Bitmap generateScaledBmp(Bitmap srcBmp, int targetWidth, int targetHeight, ByteArrayOutputStream baos, int quality) { Bitmap result = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(result); Rect rect = new Rect(0, 0, result.getWidth(), result.getHeight()); canvas.drawBitmap(srcBmp, null, rect, null); if (!srcBmp.isRecycled()) { srcBmp.recycle(); } result.compress(Bitmap.CompressFormat.JPEG, quality, baos); return result; }
需要注意的是,第一次将图片文件的宽高减半,通过Bitmap#compress方法将新Bitmap的数据写入到ByteArrayOutputStream中后,此时ByteArrayOutputStream中的数据已经大幅减少了,减少的幅度是不好控制的,不会是刚好小于1M,这里只是选取了一个比较有效的方式。
当然了,压缩操作是需要放在子线程的,具体代码如下:
Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> emitter) throws Exception { try { File f = new File(avatarFileUrl); compressBmpFileToTargetSize(f, 1024 * 1024); emitter.onNext(avatarFileUrl); emitter.onComplete(); } catch (Exception e) { e.printStackTrace(); emitter.onError(new Throwable("获取图片失败")); } } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { compositeDisposable.add(d); } @Override public void onNext(String s) { // 上传头像到服务器 } @Override public void onError(Throwable e) { ToastUtil.show(mContext, e.getMessage()); } @Override public void onComplete() { } });
最后别忘了处理下RxJava的内存泄漏:
@Override protected void onDestroy() { super.onDestroy(); compositeDisposable.dispose(); }
当然了,这里没有提供图片文件路径的兼容处理、读写权限的处理等,这些需要读者自己去实现。
更多相关内容 -
压缩文件加密,教您给winRAR压缩的文件设置密码
2021-07-18 03:33:43随小编一起给大伙演示怎么给压缩文件加密吧!很多时候我们会在工作的电脑存放有一些比较私密的照片或者文件之类,特别不希望自己的私密文件,不小心被用电脑的人看到,那该怎么好呢?下面小编给大家带来给私人文件...不管在家里还是工作上的电脑,都会存放一些自己比较隐秘的文件,特别不想别人看到,总不会拒绝别人也使用电脑吧?其实我们可以文件加上密码,这样就只有我们自己能看到了。随小编一起给大伙演示怎么给压缩文件加密吧!
很多时候我们会在工作的电脑存放有一些比较私密的照片或者文件之类,特别不希望自己的私密文件,不小心被用电脑的人看到,那该怎么好呢?下面小编给大家带来给私人文件压缩加密的方法,一起来看看吧。
以下是winRAR压缩的文件设置密码的步骤:
首先,准备好winRAR软件,网上搜索下载安装好!
第一步:选择需要压缩加密的文件/资料,鼠标点右键,点击“添加到压缩文件”,出现如下窗口:
文件电脑图解1
第二步:可以选择压缩文件的格式RAR/ZIP,其他默认,接着点击--高级,如下图所示:
压缩文件电脑图解2
第三步:在当前界面选择“设置密码”按钮,如下图所示:
压缩电脑图解3
第四步:出现的输入密码界面,在两个框内输入同样的密码,密码设置完成后点击确定按钮,如下图所示:
压缩文件电脑图解4
第五步:回到高级选项的界面,再次点击确定即可,所下图所示:
压缩电脑图解5
到这里我们完成了winRAR压缩的文件设置密码的图文步骤。
-
pdf怎么压缩到10m或5m以下?pdf文件压缩到10兆或2m以内?
2021-07-06 17:25:01今天分享一个把pdf文件压缩到10m以下的方法: 搜索一下:~~~~~~轻云pdf编辑压缩官网 打开轻云pdf编辑压缩官网,上传pdf文件,上传完毕后网站会自动压缩。 当压缩的进度条到达100%后就表示压缩好了,这个...怎么把pdf压缩到10m以下?无论是什么文件,一旦文件体积过大就会很麻烦。比如一份PDF文件比较大,传输就会很麻烦。遇到这种情况,我们可以选择对这样的PDF文件进行压缩,那么怎么压缩pdf文件大小呢?今天分享一个把pdf文件压缩到10m以下的方法:
搜索一下:~~~~~~轻云pdf编辑压缩官网
打开轻云pdf编辑压缩官网,上传pdf文件,上传完毕后网站会自动压缩。
当压缩的进度条到达100%后就表示压缩好了,这个时候会出现预览压缩后的效果选择,大家如果想预览压缩后的效果,大家点击预览效果按钮就可以了。
以上就是我给大家分享的把pdf压缩到10m以下的方法了,最大的优势就是操作简单,使用方便,需要压缩pdf的小伙伴们希望能帮到你们。
-
如何在Mac上压缩文件?
2021-03-30 15:11:38如何在Mac上压缩文件?空间不足或需要将文件发送给别人?我们将向您展示在Mac上压缩文件的多种方法中的一些方法,有需要的朋友快来跟小编看看吧! Finder的“图库”视图使您可以通过增强的预览窗格和丰富的元数据在...如何在Mac上压缩文件?空间不足或需要将文件发送给别人?我们将向您展示在Mac上压缩文件的多种方法中的一些方法,有需要的朋友快来跟小编看看吧!
Finder的“图库”视图使您可以通过增强的预览窗格和丰富的元数据在Mac上的照片文件夹中滚动。预览可以很好地用于基本用途,但缺少导航控件,出色的观看体验和其他功能。
如何在Mac上压缩大型文件?
只需选择您的文件,单击一个选项,您的文件全部被压缩。这是您的操作方式:
1.打开一个查找器窗口。
2.查找您要压缩的文件。
3.右键单击任何一个文件或文件夹,然后选择“压缩”。
4.macOS将在与原始文件相同的文件夹中创建一个ZIP存档。
您会发现压缩存档的大小比实际单个文件的大小小得多。
如何在Mac上压缩PDF文件?
在这里,我们介绍了这两种方法。
1.使用预览在Mac上压缩PDF
如果您不愿意安装第三方应用程序,请按照以下方法使用“预览”压缩PDF文件:
1.右键单击您的PDF,然后选择“打开方式”,然后选择“预览”。
2.单击顶部的“文件”菜单,然后选择“导出”。
3.在显示的屏幕上,从Quartz Filter下拉菜单中选择减小文件大小。然后,点击保存。
您的输出PDF将小于原始PDF。请记住,压缩和未压缩的PDF会有质量差异。
2.使用第三方应用程序在Mac上压缩PDF
有一个名为Lightweight PDF的免费应用程序,可让您压缩PDF文件。
这是您使用该应用程序的方法:
1.在Mac上 下载并安装Lightweight PDF应用程序。
2.开启应用程式。
3.将要压缩的PDF拖到应用程序界面上。
4.该应用程序应告诉您压缩文件的大小。
如何在Mac上压缩视频文件?
1.通过降低分辨率在Mac上压缩视频
压缩视频的一种方法是降低视频的分辨率。这会极大地影响视频的质量,但是,如果您要这样做,我们在这里展示如何:
右键单击要压缩的视频,然后选择“打开方式”,然后选择“ QuickTime Player”。
单击顶部的“文件”菜单,然后选择“导出为”。您会在展开的菜单中看到各种质量选项。单击您喜欢的视频,您的视频将使用此新分辨率。请记住,分辨率越低,视频越小。在以下屏幕上 单击“保存”以保存压缩的视频。
2.在Mac上压缩视频,对视频质量的影响较小
在macOS中压缩视频的另一种方法是更改视频的文件格式。
在下面的步骤中,我们演示如何使用HandBrake在Mac上压缩视频。
1.在Mac上 安装HandBrake。
2.打开应用程序,单击文件>开源,然后添加要压缩的视频。
3.从格式下拉菜单中 选择MKV文件。
4.随意调整其他选项(如果您认为合适)。
5.单击开始以开始压缩视频。
如何在Mac上压缩MP3和其他音频文件?
音频文件易于压缩。这是因为您所需要做的就是降低文件的比特率,并缩小原始文件的大小。
以下是在MacOS中使用Audacity(免费)压缩MP3和其他音频文件的方法:
1.如果尚未 安装Audacity,请在Mac上安装它。
2.打开应用程序,单击文件>打开,然后添加音频文件。
3.加载文件后,单击文件>导出,然后选择压缩文件的输出格式。
4.从结果屏幕上的“比特率模式”选项中 选择“常数”。
5.从质量下拉菜单中选择一个较低的比特率。如果不确定选择什么,请尝试128 kbps。然后,点击保存。
以上就是小编给大家带来的全部内容,想了解更多关于Mac相关内容,请关注macz.com吧!
-
powershell 压缩_如何使用PowerShell压缩(和解压缩)文件
2020-09-24 23:51:35powershell 压缩TheZIP file formatreduces the size of files by compressing them into a single file. This process saves disk space, encrypts data, and makes it easy to share files with others. Here’s ... -
.xz是什么文件怎么解压_如何解压缩 tar.xz 文件
2020-11-20 02:12:15本文最先发布在:如何解压缩 tar.xz 文件 - ITCoderwww.itcoder.techtar命令...XZ 是一个基于 LZMA 算法,用于压缩文件的流行算法。按照惯例,使用 xz 压缩的 tar 包名字都以 .tar.xz 或者 .txz结尾。本文讲解了... -
linux文件怎么打包、压缩和解压?详细教程来了!
2021-05-10 20:59:44在使用linux系统时,一些新手会遇到linux文件打包、压缩和解压的问题,具体该怎么解决呢?接下来为你提供详细教程,具体如下。Linux 系统中,最常用的归档(打包)命令就是 tar,该命令可以将许多文件一起保存到一个... -
怎么把图片文件压缩到20k以下
2018-10-10 14:53:15你知道怎么把图片文件压缩到20K以下吗?现在很多的网站都不可以上传大的图片,不管是报名考试还是其它的一些事情,图片超过网站特定的上传大小就不可以进行上传,那么我们怎么才能将图片文件压缩到20K以下进行上传呢... -
【解决方法】如何压缩网页字体文件
2021-08-26 11:29:53所以只能在网页中使用字体文件,又因为文件比较大,影响页面加载速度,一方面考虑使用 CDN 来保存字体文件,另一方面也考虑把文件压缩一下。 解决思路 明确了问题,下面就是怎么解决问题了。 解决这个问题有两个思路... -
Zlib文件压缩和解压
2018-08-18 15:54:29打开欲压缩文件时文件的指针 FILE * fp1; // 创建压缩文件时的指针 errno_t err; // 错误变量的定义 #ifdef WINDOWS_PLATFORM err = fopen_s( & ... -
基于哈夫曼编码对文件进行压缩和解压缩(详细讲解)
2021-04-08 10:02:43基于哈夫曼编码对文件进行压缩和解压缩(详细讲解) 本文对应c++代码实现链接 一、背景 利用特定的算法来压缩数据的工具,压缩后生成的文件称为压缩包。如果想使用其中的数据,就得用压缩软件对数据进行解压。利用... -
如何在Mac上快速压缩和解压文件?Mac上解压和压缩文件的方法
2020-12-24 03:19:34Mac电脑仅默认支持把文件压缩成zip格式,解压成zip、tar.gz,bz2等格式,有些操作需要安装第三方软件来完成,这篇文章为大家带来几种关于在Mac上解压和压缩文件的方法,有兴趣的朋友可以来了解一下载哦!转载至如何... -
java 实现压缩多个文件 成zip/rar 等压缩文件
2018-07-18 14:04:07一下代码实现的是将多个... * 压缩文件 * @param exportFilePathList * @param response */ public static void downloadPictureZip(List<String> exportFilePathList, HttpServletResponse ... -
前端性能优化 压缩静态文件gzip
2018-10-16 10:41:09前端压缩的方式很多,依赖java的有ant工具,前端自己打包压缩的有grunt,gulp,webpack,这些压缩也很重要,基本上能压缩50%以上,下面我们对压缩文件来个对比。 如图所示,这是未压缩的 ... -
小程序提示"以下文件体积超过 500KB,已跳过压缩以及 ES6 转 ES5 的处理
2021-03-26 14:49:16[JS 文件编译错误] 以下文件体积超过 500KB,已跳过压缩以及 ES6 转 ES5 的处理 现象: 微信开发者工具中代码编译提示 common/vendor.js 超过 500K。 这时候需要将过大的js文件压缩。 解决办法: 可以使用gulp进行... -
在Linux中,如何同时解压缩或解压缩多个文件
2021-05-09 03:48:04有时我们必须一次提取多个压缩和rard文件,所有文件都位于一个文件夹中。通过Ubuntu UI进行操作非常简单;您需要做的就是选择要提取的所有文件,单击鼠标右键,然后使用“提取”选项将它们全部提取出来。真正的交易... -
Linux文件压缩命令
2019-04-28 10:55:33gzip/gunzip:主要是进行单个文件的压缩和解压缩的命令。 示例:gzip hello.txt #执行压缩hello.txt ls hello.txt.gz #查看文件信息 gunzip hello.txt.gz #解压文件命令 2、tar 命令 tar可以用来打包文件,还... -
gzip命令:压缩文件或目录
2020-08-14 22:19:23再强调一下,gzip 命令只能用来压缩文件,不能压缩目录,即便指定了目录,也只能压缩目录内的所有文件。 gzip 命令的基本格式如下: [root@localhost ~]# gzip [选项] 源文件 命令中的源文件,当进行压缩操作时,... -
linux 压缩当前文件夹下所有文件
2020-08-28 14:50:55压缩当前文件夹下所有文件,压缩为a.zip。命令行的方法是怎样。 zip -r fileName.zip 文件夹名 tar tar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。 常用格式: 单个文件压缩打包 tar czvf my.tar ... -
Huffman树与文件压缩的原理
2018-07-13 12:31:35Huffman树与文件压缩 1、Huffman树的简单介绍 Huffman树,又称为最优二叉树,是加权路径长度最短的二叉树。 下面,我要用一个简单的数组构造一棵Huffman树: a[]={0,1,2,3,4,5,6,7,8,9}; 从图片里我们可以... -
js上传文件(压缩文件)
2018-07-02 13:48:01<!DOCTYPE html> <html> <head&...XMLHttpRequest上传文件(压缩文件)</title> <script type="text/javascript"> /* -
[JS 文件编译错误] 以下文件体积超过 500KB,已跳过压缩以及 ES6 转 ES5 的处理。ec-canvas/echarts.js
2021-06-16 11:28:55[JS 文件编译错误] 以下文件体积超过 500KB,已跳过压缩以及 ES6 转 ES5 的处理。ec-canvas/echarts.js 处理方法: 按你项目所需的图表定制化下载, 定制地址https://echarts.apache.org/zh/builder.html 勾选你所... -
Shell命令-文件压缩解压缩之gzip、zip
2019-01-22 08:00:00gzip 命令用于压缩文件。gzip 是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多出 .gz 的扩展名。 gzip命令的语法格式 gzip [ -acdfhlLnNrtvV19 ] [-S suffix] [ name ... ] gzip [-acdfhlLnNqrtvV.... -
用C++实现文件压缩
2016-08-15 00:28:43乍一听,这个文件压缩的名字貌似是很高大上的,其实,在数据结构中学完Huffman树之后,就可以理解这个东西其实不是那么的高不可攀。 文件压缩 所谓文件压缩,其实就是将对应的字符编码转换为另一种占据字节数少的... -
Python调用winrar.exe进行文件压缩
2020-05-18 17:26:52Python语言中有一个zipfile库,可以利用zip进行压缩解压。对于rar格式,我们可以通过`pip3 install rarfile` 安装...但是问题是没有办法实现rar文件的压缩。本文介绍了一种通过利用winrar.exe来实现Python对rar的压缩。 -
Linux 系统 压缩和解压 gz 格式文件
2021-05-13 08:20:46Linux 系统 压缩和解压 gz 格式文件引言前面我们说了在 Linux 系统上比较常用的打包压缩解压 tar 及 zip 文件 的命令,那 Linux 上还有什么...压缩文件命令将文件压缩为 .gz 格式的文件使用的命令为 gzipgzip 是 Li... -
使用Java API进行tar.gz文件及文件夹压缩解压缩
2020-08-17 07:17:55在java(JDK)中我们可以使用ZipOutputStream去创建zip压缩文件,(参考我之前写的文章 使用java API进行zip递归压缩文件夹以及解压 ),也可以使用GZIPOutputStream去创建gzip(gz)压缩文件,但是java中没有一种官方... -
在ubuntu中使用7z压缩命令分卷压缩超大文件
2019-08-16 12:42:19在ubuntu中使用7z压缩命令分卷压缩超大文件 目的:学习在ubuntu中使用分卷压缩与解压缩 环境:ubuntu 16.04 使用rar分卷压缩: 1 rara-m5-v2048mmyarchivemyfiles # 最大限制为 12M ... -
CentOS 打包压缩文件 zip 命令详解
2020-12-29 01:48:35我们再linux中常见的压缩文件有.tar.gz,.zip,.gz,在linux中,你要习惯没有.rar的日子。一下为tar,zip命令详解tar -zcvf /home/files.tar.gz /filestar -zcvf 打包后生成的文件名全路径 要打包的目录例子:把/files...