主要有两种形式:
- 压缩图片的尺寸大小
- 压缩图片的质量(尺寸不变)
1.压缩尺寸
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath,options);// 计算 inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(filePath,options);
关键的在于设置options.inSampleSize
的值,当options.inSampleSize
为1的时候不压缩,2的时候压缩一倍,options.inSampleSize
的有效值是1、2、4、8、16......
2.压缩质量
这种方式压缩后的尺寸大小不变
Bitmap bitmap = BitmapUtil.decodeBitmapFromFile(path,1080,1080);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Bitmap.CompressFormat compressFormat = Bitmap.CompressFormat.PNG ;
if(options.outMimeType.equals("image/jpeg")){
compressFormat = Bitmap.CompressFormat.JPEG;
}
bitmap.compress(compressFormat,30,stream);
这里需要注意compressFormat
的值一定要和原图一直,否则压缩会不成功。这里使用BitmapFactory.Options
先测量出图片文件的信息,options.outMimeType
就表示图片的mime类型。
不要用后缀名检测格式,后缀名都是虚的,用户可以自由修改。
使用
有时候一张图片的质量很小,但是尺寸很大,加载时可能出出现这个警告:
Bitmap too large to be uploaded into a texture (440x6405, max=4096x4096)
虽然不会抛出错误,但是图片会不显示出来。
这是硬件加速的一个限制,关闭硬件加速即可。
- 通常压缩上传可以两种方式一起压缩。
-
ImageView
控件显示图片一般使用尺寸压缩后显示。