首先是最基本的调用图库获取图像的代码。我直接贴出来。也是当个笔记吧。事实是我记不下来。。。
先是调用系统图库
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.putExtra("crop", true);
intent.putExtra("return-data", true);
startActivityForResult(intent, 2);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == 2) {
Uri uri = data.getData();
ContentResolver cr = this.getContentResolver();
try {
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
所以接下来我就改了改代码。
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;//指定加载图片方式为只加载头信息
BitmapFactory.decodeStream(cr.openInputStream(uri), null, opts);//将头信息加载到opts中
//3.计算缩放比例
double dx = opts.outWidth/300.0;
double dy = opts.outHeight/300.0;
int scale = 1;
if(dx>dy&&dy>1){
System.out.println("按照水平方法缩放,缩放比例:"+dx);
scale = (int)(dx+0.5);
}
if(dy>dx&&dx>1){
System.out.println("按照垂直方法缩放,缩放比例:"+dy);
scale = (int)(dy+0.5);
}
//4.缩放加载图片到内存。
opts.inSampleSize = scale;
opts.inJustDecodeBounds = false;//真正的去解析这个位图。
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, opts);
But。这有有问题了。这样缩放是等比缩放。然后头像一般都是正方形的。然而我帅气的自拍是长方形的呀。我处女座就不能忍那两边留有的空白了。
于是我默默地弄了两种处理方式:
1.拉伸。。。
就是吧图片拉伸成正方形
int width = bitmap.getWidth();
int height = bitmap.getHeight();
// 计算缩放比例
float scaleWidth = ((float) 300) / width;
float scaleHeight = ((float) 300) / height;
// 取得想要缩放的matrix参数
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// 得到新的图片
Bitmap bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
2.截取部分图片。
int width = bitmap.getWidth();
int height = bitmap.getHeight();
if (width>height){
Bitmap bitmap = Bitmap.createBitmap(bitmap,(width-height)/2,0,height,height);
}else {
Bitmap bitmap = Bitmap.createBitmap(bitmap,0,(height-width)/2,width,width);
}
PS:以上观点仅仅是作者自己的想法。如果有更好的处理方案什么的。欢迎各位指出。谢谢谢谢谢、