广告
返回顶部
首页 > 资讯 > 移动开发 >Android WebP 图片压缩与传输
  • 838
分享到

Android WebP 图片压缩与传输

图片压缩webp图片压缩Android 2022-06-06 07:06:08 838人浏览 安东尼
摘要

1. 简介 直到4g时代,流量依然是宝贵的东西。而移动网络传输中,最占流量的一种载体:图片,成为了我们移动开发者不得不关注的一个问题。 我们关注的问题,无非是图片体积和质量如何

1. 简介

直到4g时代,流量依然是宝贵的东西。而移动网络传输中,最占流量的一种载体:图片,成为了我们移动开发者不得不关注的一个问题。

我们关注的问题,无非是图片体积和质量如何达到一个比较和谐的平衡,希望得到质量不错的图片同时体积还不能太大。

走在时代前列的谷歌给出了一个不错的答案——WEBP。

WebP是一种图片文件格式,在相同的压缩指标下,webp的有损压缩能比jpg小 25-34%。而在我自己的测试里,有时候能小50%。

2. 大企业背书

WebP在2010年发布第一个版本,到现在已经6年了,谷歌旗下的各种网站G+、以及非常有代表性的YouTube,他的视频文件格式WebM就是基于WebP构造的。

据说腾讯、淘宝、美团也有部分应用。

3. Android 端 JPG 转换 WebP

RxJava线程转换:


 String[] imgs = new String[]{"1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg"};
 String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/test/";
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
// test = api.getBuilder().create(Test.class);
 String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE
 , Manifest.permission.READ_PHONE_STATE
 , Manifest.permission.CAMERA};
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
 requestPermissions(permissions, 0);
 }
 compress();
 }
 private void compress() {
 Observable.from(imgs)
 .subscribeOn(Schedulers.io())
 .doOnNext(new Action1<String>() {
  @Override
  public void call(String imgName) {
  compress(imgName);
  }
 })
 .subscribe();
 }
 private void compress(String imgName) {
 try {
 File file = new File(path, imgName);
 Log.i("compress", "jpg start");
 byte[] bytes = BitmapUtil.compressBitmapToBytes(file.getPath(), 600, 0, 60, Bitmap.CompressFORMat.JPEG);
 File jpg = new File(path, imgName + "compress.jpg");
 FileUtils.writeByteArrayToFile(jpg, bytes);
 Log.i("compress", "jpg finish");
 Log.i("compress", "----------------------------------------------------");
 Log.i("compress", "webp start");
 byte[] bytes1 = BitmapUtil.compressBitmapToBytes(file.getPath(), 600, 0, 60, Bitmap.CompressFormat.WEBP);//分别是图片路径,宽度高度,质量,和图片类型,重点在这里。
 File webp = new File(path, imgName + "compress.webp");
 FileUtils.writeByteArrayToFile(webp, bytes1);
 Log.i("compress", "webp finish");
 } catch (IOException e) {
 e.printStackTrace();
 }
 }

我的测试机器也是Oneplus 1 ,CM13,所以需要获取相应的权限。

利用RxJava来做线程操作,在io线程里做了耗时操作。


public static byte[] compressBitmapToBytes(String filePath, int reqWidth, int reqHeight, int quality, Bitmap.CompressFormat format) {
 Bitmap bitmap = getSmallBitmap(filePath, reqWidth, reqHeight);
 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 bitmap.compress(format, quality, baos);
 byte[] bytes = baos.toByteArray();
 bitmap.recycle();
 Log.i(TAG, "Bitmap compressed success, size: " + bytes.length);
 return bytes;
 }
 public static Bitmap getSmallBitmap(String filePath, int reqWidth, int reqHeight) {
 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inJustDecodeBounds = true;
 BitmapFactory.decodeFile(filePath, options);
 options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
 options.inJustDecodeBounds = false;
// options.inPreferQualityOverSpeed = true;
 return BitmapFactory.decodeFile(filePath, options);
 }
 public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
 int h = options.outHeight;
 int w = options.outWidth;
 int inSampleSize = 0;
 if (h > reqHeight || w > reqWidth) {
 float ratioW = (float) w / reqWidth;
 float ratioH = (float) h / reqHeight;
 inSampleSize = (int) Math.min(ratioH, ratioW);
 }
 inSampleSize = Math.max(1, inSampleSize);
 return inSampleSize;
 }

根据输入的宽高值计算分辨率的缩小比例,再根据输入的压缩质量数值,压缩图片,获得压缩后bitmap,然后再将其保存成本地文件。

这是非常常见的图片压缩手段。

4. WebP对比

我用我日常生活里拍下的照片来做简单的对比测试,不是特别严谨,仅供简单的参考。

拍照设备是刷了CM13的 一加 1 。拍照场景都是日常生活特别常见的。

以下是原图预览,就不一个个放出来了,太大。

缩小分辨率,同时压缩质量

文件名 照片原图 压缩后jpg 压缩后webp 压缩比
1.jpg 5760 kb 98 kb 74 kb 24.49%
2.jpg 4534 kb 64 kb 35 kb 45.31%
3.jpg 4751 kb 93 kb 68 kb 26.88%
4.jpg 7002 kb 121 kb 95 kb 21.49%
5.jpg 5493 kb 111 kb 91 kb 18.02%

平均压缩比是:27.24%

按照原图大小,不缩小分辨率,仅压缩质量。

文件名 照片原图 压缩后jpg 压缩后webp 压缩比
3.jpg 4751 kb 796 kb 426 kb 46.48%

至此,我们就非常方便的使用了webp来对图片进行更加极致的压缩,兼顾了图片体积和质量。

呃,csdn不支持上传webp的图片。你们可以看压缩包。
我嫌麻烦,可能不会传压缩包了……所以,你们看截图吧~

睁大眼睛对比一下有啥区别,不缩小分辨率,仅压缩质量,这个3.jpg可是有46.48%的压缩比噢。
这个场景是晚上在灯光充足的室内吃饭拍的。

5. 用Gzip再压缩

刚刚是针对本地图片的压缩,接下来,我们需要将图片传输到服务器。这个过程依然有优化空间,就是利用Gzip。

Gzip的作用对象是整个请求体,具体来说是对请求体中的内容进行可逆的压缩,类似pc上zip的那种。

Gzip压缩的请求体,需要加入相应的header: 「Content-Encoding:gzip」。
这事情Retrofit会帮你做好。

后台服务器接收到在此类型的请求,就会对请求体解压,因此需要后端的支持。

另外要注意的是,Gzip针对比较大的请求体压缩效果不错,尤其是未经过压缩的纯文本类型。

如果请求本来就很小,那么就不要使用gzip压缩了,压缩包自己的元数据可能比你的请求体还大,得不偿失。你可以自己测试一下,我估计zip和gzip的压缩字典比较类似,可以直接在pc上做测试。

6. Retrofit对请求Gzip压缩

网络请求方面,我项目里使用Retrofit (OKHttp) + RxJava。

Retrofit的Gzip压缩,本质上是通过OKHttp的拦截器来完成的。

0拦截请求
1加入header
2压缩请求
3发送出去

搞定,方便。

https://GitHub.com/square/okhttp/wiki/Interceptors



final class GzipRequestInterceptor implements Interceptor {
 @Override public Response intercept(Interceptor.Chain chain) throws IOException {
 Request originalRequest = chain.request();
 if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) {
 return chain.proceed(originalRequest);
 }
 Request compressedRequest = originalRequest.newBuilder()
 .header("Content-Encoding", "gzip")
 .method(originalRequest.method(), gzip(originalRequest.body()))
 .build();
 return chain.proceed(compressedRequest);
 }
 private RequestBody gzip(final RequestBody body) {
 return new RequestBody() {
 @Override public MediaType contentType() {
 return body.contentType();
 }
 @Override public long contentLength() {
 return -1; // We don't know the compressed length in advance!
 }
 @Override public void writeTo(BufferedSink sink) throws IOException {
 BufferedSink gzipSink = Okio.buffer(new GzipSink(sink));
 body.writeTo(gzipSink);
 gzipSink.close();
 }
 };
 }
}

7. 请求体抓包对比

我会用Fiddler4 监测整个请求过程,以方便我们得知实际传输了多大的数据。

上传的具体代码就不发了,这个不是重点。

我把请求抓包之后,把request这个保存下来。

这是同时上传两张图片的大小

文件名 请求体大小
WebP+Gzip 169kb
WebP 222kb

用Gzip压缩 比不加Gzip 又小 23% ! jpg我就不发了,可以按照前面的估算一下~

WebP比Jpg小27%,然后gzip+webp又比单纯的webp小23%,节省下来的流量多可观啊!

8. 最后

WebP默认只支持Android 4.0以上,现在项目最低支持的版本是16,所以没什么问题。如果你的项目最低要支持到2.0,好像也有第三方支持,但是我建议你抓产品出去打一顿。

在我们的项目里,iOS没用使用该技术。

根据下面的参考链接的数据以及我本人测试数据来看,WebP不仅大大的节省了用户的流量,同时还可以加速图片传输速度。就照片传输的角度来看,是非常有利的。

如果还是有人告诉你:“IOS做不了,不做了。”,“后台XXX不做了。”

我建议你抓产品出去打一顿。

相关参考:

http://isux.tencent.com/introduction-of-webp.html(产品经理看这个)

http://blog.csdn.net/GeekLei/article/details/41147479 (后台需要看这个)

https://developers.Google.com/speed/webp/

http://www.infoq.com/cn/articles/sdk-optimazation?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term (他们表示IOS也没有用上)

http://blog.csdn.net/minGChunhu/article/details/8155742(Android全部都要看)

您可能感兴趣的文章:Android开发之图片压缩工具类完整实例android图片压缩的3种方法实例android bitmap compress(图片压缩)代码Android图片压缩上传之基础篇Android中3种图片压缩处理方法android 将图片压缩到指定的大小的示例Android图片压缩方法并压缩到指定大小Android实现图片压缩(bitmap的六种压缩方式)Android图片压缩以及优化实例android图片压缩工具类分享


--结束END--

本文标题: Android WebP 图片压缩与传输

本文链接: https://www.lsjlt.com/news/24105.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android WebP 图片压缩与传输
    1. 简介 直到4g时代,流量依然是宝贵的东西。而移动网络传输中,最占流量的一种载体:图片,成为了我们移动开发者不得不关注的一个问题。 我们关注的问题,无非是图片体积和质量如何...
    99+
    2022-06-06
    图片 压缩 webp 图片压缩 Android
  • Android图片压缩上传之基础篇
    在android程序开发中我们经常见到需要上传图片的场景,在这里有个技术点,需要把图片压缩处理,然后再进行上传。这样可以减少流量的消耗,提高图片的上传速度等问题。 关于andr...
    99+
    2022-06-06
    压缩 Android
  • Android中怎么实现图片压缩与上传功能
    Android中怎么实现图片压缩与上传功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先需要对图片进行压缩,这方面可以使用第三方的库,我在实际的开发中使用的...
    99+
    2023-05-30
    android
  • Android图片压缩(质量压缩和尺寸压缩)
    在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可...
    99+
    2023-05-31
    android 图片压缩 roi
  • 小程序图片上传压缩
    上传图片是小程序常见的功能,例如点评类小程序邀请用户分享照片、电商类小程序要求商家上传商品照片。 伴随着照片像素越来越高,图片体积越来越大,小程序开发者需要压缩图片,否则将导致用户上传图片失败或加载时...
    99+
    2023-09-18
    小程序 前端 javascript
  • Android获取照片、裁剪图片、压缩图片
    前言在做上一个项目时深深受到了图片上传的苦恼。图片上传主要分为两个部分,首先要获取图片,而获取图片可以分为从文件获取或者拍照获取。第二个部分才是上传图片,两个部分都是走了不少弯路。由于Android系统的碎片化比较严重,我们可能出现在第一台...
    99+
    2023-05-31
    android 获取照片 裁剪图片
  • uniapp图片上传与压缩,兼容小程序与H5
    图片上传借助了Uview2.0的组件 保存 //uniapp插件市场图片压缩工具(https://ext.dcloud.net.cn/pluginid=2316)export default ...
    99+
    2023-09-01
    uni-app 小程序
  • android bitmap compress(图片压缩)代码
    android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片。有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么就上传就会很慢(在有些网络...
    99+
    2022-06-06
    压缩 compress 图片 bitmap 图片压缩 Android
  • H5如何实现图片压缩与上传功能
    这篇文章主要为大家展示了“H5如何实现图片压缩与上传功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“H5如何实现图片压缩与上传功能”这篇文章吧。canvas压...
    99+
    2022-10-19
  • Android实现图片压缩(bitmap的六种压缩方式)
    Android中图片是以bitmap形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小计算方式: 图片长度 x 图片宽度 x...
    99+
    2022-06-06
    压缩 图片 bitmap 图片压缩 Android
  • Android-图片压缩详解:原理、方法与实践
    前言1. 图片压缩的原理2. Android图片压缩的方法2.1 BitmapFactory.Options2.1.1 尺寸压缩2.1.2 质量压缩 2.2 第三方库 3. 实践:Android图片压缩3.1 创建...
    99+
    2023-08-18
    android android studio ide
  • Android性能优化(六)图片压缩
    一、压缩图片 文件压缩——内存压缩 二、文件压缩方式 1.质量压缩   2.尺寸压缩   3.格式选择:JPEG/WEBP (4.0以上) 三、压缩原理 /frameworks...
    99+
    2022-06-06
    压缩 图片 优化 图片压缩 Android
  • Android图片压缩的实例详解
    Android图片压缩的实例详解在做微信分享的时候,由于分享的缩略图要求不得大于32K,否则不能调起微信,所以总结了一下Android图片的压缩问题,大部分资料都是来自网上各位的分享,自己只是完善或修改了一下,本着继续分享的精神,也方便自己...
    99+
    2023-05-30
    android 图片压缩 roi
  • java 实现图片像素质量压缩与图片长宽缩放
    目录java 图片像素质量压缩与图片长宽缩放java 修改图片dpi(像素/大小)java 图片像素质量压缩与图片长宽缩放 今天找到的这个方法比以前项目用到的方法更好,这里记录下,方...
    99+
    2022-11-12
  • 详解Android 图片的三级缓存及图片压缩
    为什么需要图片缓存 Android默认给每个应用只分配16M的内存,所以如果加载过多的图片,为了防止内存溢出,应该将图片缓存起来。图片的三级缓存分别是: 内存缓存 本地...
    99+
    2022-06-06
    压缩 三级缓存 图片 图片压缩 缓存 Android
  • ajax如何上传图片到PHP并压缩图片显示
    本篇内容主要讲解“ajax如何上传图片到PHP并压缩图片显示”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ajax如何上传图片到PHP并压缩图片显示”吧!HTML代码<div i...
    99+
    2023-06-08
  • java实现上传图片并压缩图片大小功能
    Thumbnailator 是一个优秀的图片处理的Google开源Java类库。处理效果远比Java API的好。从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式...
    99+
    2023-05-31
    java 上传图片 压缩图片
  • Android 图片压缩并保存的方法
    参考:     1.https://blog.csdn.net/pbm863521/article/details/74391787     2.https://www.jia...
    99+
    2022-06-06
    压缩 方法 图片 图片压缩 Android
  • Vue使用canvas实现图片压缩上传
    本文实例为大家分享了Vue使用canvas实现图片压缩上传的具体代码,供大家参考,具体内容如下 场景:如用户头像等 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大...
    99+
    2022-11-12
  • 使用canvas怎么对图片压缩上传
    使用canvas怎么对图片压缩上传?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先得有一个上传按钮。<input type="file"&...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作