以下都以8.0为例:
真正加载bitmap是靠对象的long mNativePtr指向native中的地址
Bitmap只有createBitmap 而没有new方法。
在系统源码里(8.0)/frameworks/base/core/jni/android/graphics/Bitmap.cpp查看
像素存放在哪里?Native堆
像素是由Bitmap.cpp加载吗?不是,而是SkBitmap
SkBitmap有一个skia引擎,可以调用GPU代码。
2.png 3.pngFlutter框架、谷歌浏览器 都用的skia
skia缺点:压缩差,文件非常大:ios 2M的图片,android 6M才能媲美。
skia封装了jpeg ;类似restfit与okhttp
传统压缩方式(原生):
1、bitmap.compress(...);
2、也可以尺寸压缩:大小减小到原来的1/10
jpeg图像引擎实现:
skia本身是没有使用哈夫曼的:
举例:
4.png
微信发送图片(压缩与未压缩)差别不大 大小差很多:原来有340K ,压缩后有41K
尺寸压缩完,内容模糊
质量压缩:完全失真
"压缩.jpg"是我们的代码生成的
实现:
5.png使用jpeg压缩,哈夫曼压缩条件 元数据--》不能再分割
bitmap是元数据吗?不是,A_R_G_B 4个字节
所以要取出argb一整张图片放到数组里。
6.png
网友评论