本篇文章将继续从7Z极限压缩和WebP使用来介绍网络传输与数据存储优化:
一、7Z极限压缩
一些文件过大或者是容量太大了,占用硬盘太多空间了。此刻可以使用压缩软件进行压缩,让它的体积变小了。其中极限压缩可以让文件夹或者是文件,压缩的最小。那么如何使用这个极限压缩功能的。
1、你要到网上下载这个压缩的程序,点击它,点击【install】。
2、此刻软件会安装到电脑,找到需要压缩的文件以及文件夹。
3、右键文件或者文件夹选择这个7z,选择压缩包,点击这个压缩等级这里。
4、选择这个极限压缩,然后压缩算法选择【LZMA2】。
5、然后点击这个确定,软件将会以极限压缩的方式进行压缩的。压缩后的文件明显变小了的。
二、WebP使用 图片优化
2.1、什么是 WebP?
WebP(发音 weppy,项目主页),是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8。根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使这些 PNG 文件经过其他压缩工具压缩之后,WebP 还是可以减少 28%的文件大小。
2.2、当下Android图片优化之WebP的必然选择
对于一个好的APP,当然是越小越好,然而,在APP中图片就占据了很大的一部分体积,所以图片的优化是开发人员必须要做的事情,而原有图片的png、jpeg、GIF等格式的优化已经达到了极致,所以只得另寻出路,因此有了WebP。由于WebP的特性,如果把WebP运用到APP中将会使我们的APP体积大小得到很大程度的缩小,APP也会得到一个质的变化,所以,WebP在APP中的使用将是目前我们图片优化的不二选择。
2.3、WebP的转换
WebP的转换:WebP与其他常用的图片格式之间是可以相互转换的,webp转换工具有:XnConvet,智图,ISparta.
2.4、WebP的兼容性
WebP的兼容性:4.2.1+ 对于webp的decode、encode是完全支持的(包含半透明的webp图)对于4.0+ 到 4.2.1 ,只支持完全不透明的decode、encode的webp图,4.0 以下,应该是默认不支持webp的(编码解码)。
2.5、Android下WebP的使用
想在APP中使用WebP,首先我们就得解决它的兼容性问题。步骤如下:
1、添加webp的支持,加载so文件,添加libwebp.jia包
(1)获取so文件和libwebp.jia包:可以从https://github.com/EverythingMe/webp-android下载解析库,然后ndk-build得到so文件。同时也能在解析库里面得到libwebp.jia包。
(2)得到so文件和libwebp.jia后拷到项目的app的libs目录下。
(3)在appbuild添加依赖。
添加成功后在app目录下会生成这样的一个文件。
自此 so文件添加依赖成功。
2、第二步,添加WebpUtils文件,里面有通过so包来处理webp文件成为byte数组的方法。
我们可以通过以下方法来解决兼容性问题(4.2.1以下版本也可以显示webp格式图片,包括半透明图片)。
关键代码:
**public class **WebPDecoder {
**private static **WebPDecoder *instance *= **null**;
**private **WebPDecoder() {
System.*loadLibrary*(**"webp_evme"**);
}
**public static **WebPDecoder getInstance() {
**if **(*instance*==**null**) {
**synchronized **(WebPDecoder.**class**) {
**if **(*instance*==**null**) {
*instance *= **new **WebPDecoder();
}
}
}
**return ***instance*;
}
**public **BitmapdecodeWebP(**byte**[] encoded) {
**return **decodeWebP(encoded,0,0);
}
**public **BitmapwebpToBitmap(InputStream is) {
Bitmap bitmap = **null**;
**if **(Build.VERSION.***SDK_INT***< Build.VERSION_CODES.***JELLY_BEAN_MR1***) {
bitmap = WebPDecoder.*getInstance*().decodeWebP(*streamToBytes*(is));
} **else **{
bitmap = BitmapFactory.*decodeStream*(is);
}
**return **bitmap;
}
**private static byte**[] streamToBytes(InputStream is) {
ByteArrayOutputStream os = **new **ByteArrayOutputStream(1024);
**byte**[]buffer = **new byte**[1024];
**int **len;
**try **{
**while **((len= is.read(buffer)) >=0) {
os.write(buffer, 0, len);
}
} **catch **(java.io.IOExceptione) {
}
**return **os.toByteArray();
}
3、项目里在需要的地方直接调用
final ImageView imageView = (ImageView) findViewById(R.id.imageView);
try {
imageView.setImageBitmap(WebPDecoder.getInstance().webpToBitmap(getAssets().open("aa.webp")));
} catch (IOException e) {
e.printStackTrace();
}