Charles可以模拟各种网络环境
1. 如何计算图片的大小?
总分辨率 * 像素表示的位数。
这公式是算位图的占用空间大小,而JPEG&JFIF是将位图压缩,不仅压缩图像质量还压缩图像占用空间(后面会讲到)。也就是说图像压缩不等于压缩质量和分辨率,还有压缩占用空间。
2. JPEG&JFIF压缩做了什么?这个质量到底代表了什么?
其实JPEG&JFIF做了两件事情:
去掉视觉上的冗余信息
去掉数据本身结构的冗余
第一步实现通过色彩空间转换、缩减取样、离散余弦变换、量化,第二步实现通过编码。
其实这部分可以选择跳过,只是我为了理解压缩质量是怎么体现的而去看的,后面也发现理解后很多问题都很清晰明白。
3. App怎么裁剪分辨率?
影响位图的大小有分辨率,那么减少分辨率也就能使压缩得更小了。注意这里裁剪分辨率不等于裁剪图片,不会丢失图片的某一部分。
Bitmap image = BitmapFactory.decodeStream(file);
int bitmapWidth = image.getWidth();
int bitmapHeight = image.getHeight();
Matrix matrix = new Matrix();
matrix.postScale(scaleRatio, scaleRatio);
Bitmap scaledBitmap = Bitmap.createBitmap(image, 0, 0, bitmapWidth, bitmapHeight, matrix, false);
我们是等比例裁剪,比例和裁剪后占用空间大小并不一定成线性关系,这个裁剪具体怎么实现的和每个像素的质量有关系。
4. 用户设备主要分辨率
在友盟查看了我们的应用的相关数据:
Android,较大占比的是宽度1080像素和720像素的设备。
5. 压缩质量的大致规律
- 会出现压缩出来反而比原图大的问题,后面会讨论
- 在没有裁剪的情况下,压到0.6依旧不是太理想,特别是分辨率更高的照片。
- 在excel表格中将数据组成折线图,可以看出在0.9、0.8的时候下降幅度较大,后面相对平缓一点。
6. 等比例裁剪后压缩质量的大致规律
- 可以看到裁剪这个分辨率后压缩质量0.6的大小相对可接受,而且图片质量影响也较小。
- 在这个分辨率下,压缩质量0.8时基本压缩到1/4至1/5。
参考