jepg图像引擎实现超过原生的图片压缩性能

2021-04-22  本文已影响0人  flynnny

以下都以8.0为例:
真正加载bitmap是靠对象的long mNativePtr指向native中的地址
Bitmap只有createBitmap 而没有new方法。

1.png

在系统源码里(8.0)/frameworks/base/core/jni/android/graphics/Bitmap.cpp查看

像素存放在哪里?Native堆

像素是由Bitmap.cpp加载吗?不是,而是SkBitmap

SkBitmap有一个skia引擎,可以调用GPU代码。

2.png 3.png

Flutter框架、谷歌浏览器 都用的skia

skia缺点:压缩差,文件非常大:ios 2M的图片,android 6M才能媲美。

skia封装了jpeg ;类似restfit与okhttp

传统压缩方式(原生):
1、bitmap.compress(...);
2、也可以尺寸压缩:大小减小到原来的1/10

jpeg图像引擎实现:
skia本身是没有使用哈夫曼的:

7.png

举例:


4.png

微信发送图片(压缩与未压缩)差别不大 大小差很多:原来有340K ,压缩后有41K

尺寸压缩完,内容模糊

质量压缩:完全失真

"压缩.jpg"是我们的代码生成的

实现:

5.png

使用jpeg压缩,哈夫曼压缩条件 元数据--》不能再分割
bitmap是元数据吗?不是,A_R_G_B 4个字节

所以要取出argb一整张图片放到数组里。

6.png
上一篇下一篇

猜你喜欢

热点阅读