总的来看,图片的压缩,可以从尺寸、质量两个方向来操作。
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;
}
将图片的大小压缩成用户的期望大小,来减少占用内存。