总的来看,图片的压缩,可以从尺寸、质量两个方向来操作。
1、质量压缩
2、尺寸压缩(2的幂次方比例、任意比例、任意尺寸)
一、质量压缩-改变图片的位深以及透明度:
1、质量压缩需要注意,改变的是图片的质量quality,本身由于没有改变图片的分辨率以及图片格式性质(RGB_565、ARGB_8888、ARGB_4444)等,所以图片在内存中占有的大小不变,但是输出文件保存时,文件确实变小了。
private void compressQuality() {
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
mSrcSize = bm.getByteCount() + "byte";
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
byte[] bytes = bos.toByteArray();
mSrcBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
质量压缩不会减少图片的像素,它是在保持像素的前提下改变图片的位深及透明度,来达到压缩图片的目的,图片的长,宽,像素都不会改变,那么bitmap所占内存大小是不会变的。参数介绍:
- format是压缩后的图片的格式,可取值:Bitmap.CompressFormat .JPEG、~.PNG、~.WEBP。
- quality的取值范围为[0,100],值越小,经过压缩后图片失真越严重,当然图片文件也会越小。(PNG格式的图片会忽略这个值的设定)
- stream指定压缩的图片输出的地方,比如某文件。
2、质量压缩-改变像素占用的位数
private void compressRGB565() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
mSrcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
}
这是通过压缩像素占用的内存来达到压缩的效果,一般不建议使用ARGB_4444,因为画质实在是辣鸡,如果对透明度没有要求,建议可以改成RGB_565,相比ARGB_8888将节省一半的内存开销。二、尺寸压缩:
1、直接设置2的幂次方比例压缩
API:
其中有两个参数:
- pathName是图片文件的路径。
- opts 就是所谓的采样率,它里边有很多属性可以设置,我们通过设置属性来达到根据自己的需要,压缩出指定的图片。
private void compressSampling() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
mSrcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
}
采样率压缩其原理其实也是缩放bitamp的尺寸,通过调节其inSampleSize参数,比如调节为2,宽高会为原来的1/2,内存变回原来的1/4.2、通过缩放长款一定的比例达到压缩
private void compressMatrix() {
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
mSrcBitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
bm = null;
}
其实也是对长、宽做一定比例的压缩。注意防止比例失真。这样就可以把图片压缩为原来的1/3,1/5等这样的普通比例。
3、直接输出固定长款像素数的图片
private void compressScaleBitmap() {
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
mSrcBitmap = Bitmap.createScaledBitmap(bm, 600, 900, true);
bm = null;
}
将图片的大小压缩成用户的期望大小,来减少占用内存。

本文介绍了两种主要的图片压缩方法:质量压缩和尺寸压缩。质量压缩通过调整位深和透明度来减小文件大小而不改变分辨率;尺寸压缩则通过改变图片尺寸来实现内存占用的减少。
6030

被折叠的 条评论
为什么被折叠?



