很多同学进行Android开发的时候,不可避免的会遇到图片的剪裁,比如剪裁头像。
怎么打开照相机或者打开图库本文暂时不讲,本文主要介绍,剪裁时遇到的问题。
剪裁界面的参数设置
我们知道,此类图片的来源有拍照和图库,而可以采取的方式有
- 使用Bitmap并返回数据
- 使用Uri不返回数据
我们可以用以下代码打开系统提供的剪裁界面
Intent intent = null;
intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
//剪裁框比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//输出的宽和高(对应输出图的质量)
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
//是否保存比例
intent.putExtra("scale", true);
//将URI指向相应的file
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
//是否将数据保留在Bitmap中返回
intent.putExtra("return-data", true);
intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
activity.startActivityForResult(intent, 3);
其中的outputX与outputY为输出的图大小,数值越大,图片的质量越高。
而根据经验,return-data设为true时,如果output大于400,很可能造成程序的闪退。
缩略图
对于缩略图,我们对画质的要求不高,我们可以将return-data设为true。这时,你将会获得一个与内部数据关联的Action,并且Bitmap以此方式返回。
可以通过以下代码,在onActivityResult中获取到Bitmap
Bundle extras = data.getExtras();
Bitmap bitmap = (Bitmap) extras.get("data");
大图
如果我们想截取的图为大图,此时对像素的要求比较高,需要将output设得比较大(超过400),这时,我们就要将return-data设为false。这时,我们就只能通过uri来得到图片了。
我们可以用MediaStore.EXTRA_OUTPUT关联到一个Uri,在onActivityResult中,可以通过以下代码得到Bitmap
Bitmap bitmap = null;
try {
//通过uri直接获取bitmap
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imgUri);
} catch (IOException e) {
e.printStackTrace();
}
而outputX和outputY我们都可以设为大于400的数,得到质量较高的图片。