有的时候我们需要一张很小的图片,但是原有的图片非常大,比如说头像等,这时候我们需要对图像进行压缩处理。把原先高分辨率的图片压缩到指定的大小。
这里我们用到了两个类:BitmapFactory、BitmapFactory.Options。
不要忘记权限
代码:
1.封装成工具类FileUtils
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap.Config;
import android.os.Environment;
public class FileUtils {
//保存的路径
public static String SPATH = Environment.getExternalStorageDirectory()+
"/PHOTO_AB/";
//保存(处理后的图片)的函数
public static File saveBitmap(Bitmap bm,String picName){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int option = 100;
bm.compress(Bitmap.CompressFormat.JPEG, option, baos);
FileOutputStream fos;
File f = new File(SPATH+picName+".JPEG");
if(f.exists()){
f.delete();
}
try {
fos = new FileOutputStream(f);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return f;
}
public static Bitmap decodeSampleBitmapFromResource(String path,
int reqWith,int reqHeight){
//第一次解析将inJustDecodeBounds设置为true,来获取图片大小
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.RGB_565;
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
//根据传入的宽和高,计算出和合适的inSampleSize的值
options.inSampleSize = calInSampleSize(options,reqWith,reqHeight);
//使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(path, options);
}
/**
* 根据传入的宽和高,计算出和合适的inSampleSize的值
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
public static int calInSampleSize(BitmapFactory.Options options,int reqWidth,
int reqHeight){
//源图片的高度和宽度
int width = options.outWidth;
int height = options.outHeight;
int inSampleSize = 1;
if(height>reqHeight || width>reqWidth){
//计算出实际宽高和目标宽高的比例
int heightRatio = Math.round((float)height/(float)reqHeight);
int widthRatio = Math.round((float)width/(float)reqWidth);
inSampleSize = heightRatio<widthRatio?heightRatio:widthRatio;
}
return inSampleSize;
}
private static boolean isFileExist(String fileName){
File f = new File(SPATH + fileName);
return f.exists();
}
}
2.使用
File file = new File(capturePath);
//对图片进行预处理
Bitmap bitmap = FileUtils.decodeSampleBitmapFromResource(file.getAbsolutePath(), 100, 100);
file = FileUtils.saveBitmap(bitmap, file.getName());
这个我感觉理解也罢,不理解也罢。就是那么一个固定模式,固定方法。