在Android编程中,从相册选取或是拍照选取一张照片然后对其进行剪切的需求非常的多
之前的一篇文章只说到如何从相册中获取一张照片,今天就跟大家说说如何将获取到的相片进行剪切
我们先说一下思路,在android系统中就自带了图片剪切的应用,所以,我们只需要将我们获取到的相片传给图片剪切应用,再将剪切好的相片返回到我们自己的界面显示就ok了
第一步,我们可以先激活系统图片或是相机来获取相片,看代码
- /*
- * 从相册获取
- */
- public void gallery(View view) {
- // 激活系统图库,选择一张图片
- Intent intent = new Intent(Intent.ACTION_PICK);
- intent.setType("image/*");
- // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERY
- startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
- }
- /*
- * 从相机获取
- */
- public void camera(View view) {
- // 激活相机
- Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
- // 判断存储卡是否可以用,可用进行存储
- if (hasSdcard()) {
- tempFile = new File(Environment.getExternalStorageDirectory(),
- PHOTO_FILE_NAME);
- // 从文件中创建uri
- Uri uri = Uri.fromFile(tempFile);
- intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
- }
- // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA
- startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
- }
第二步,通过startActivityForResult()方法我们可以在onActivityResult()中来获取到相应的返回值
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == PHOTO_REQUEST_GALLERY) {
- // 从相册返回的数据
- if (data != null) {
- // 得到图片的全路径
- Uri uri = data.getData();
- crop(uri);
- }
- } else if (requestCode == PHOTO_REQUEST_CAREMA) {
- // 从相机返回的数据
- if (hasSdcard()) {
- crop(Uri.fromFile(tempFile));
- } else {
- Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!", 0).show();
- }
- } else if (requestCode == PHOTO_REQUEST_CUT) {
- // 从剪切图片返回的数据
- if (data != null) {
- Bitmap bitmap = data.getParcelableExtra("data");
- this.iv_image.setImageBitmap(bitmap);
- }
- try {
- // 将临时文件删除
- tempFile.delete();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- super.onActivityResult(requestCode, resultCode, data);
- }
第三步,注意到里边有一个crop()方法,顾名思义,就是用于剪切图片的
/*
* 剪切图片
*/
private void crop(Uri uri) {
// 裁剪图片意图
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");// 发送裁剪信号
// 裁剪框的比例,1:1
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// 裁剪后输出图片的尺寸大小,剪裁的图片是50dp*50dp
intent.putExtra("outputX", dip2px(MainActivity.this, 50));
intent.putExtra("outputY", dip2px(MainActivity.this, 50));
intent.putExtra("outputFormat", "JPEG");// 图片格式
intent.putExtra("noFaceDetection", true);// 取消人脸识别
intent.putExtra("return-data", true);// 是否将数据保留在Bitmap中返回,
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT
startActivityForResult(intent, PHOTO_REQUEST_CUT);
}
// 将dip转化为pixel
public int dip2px(Context context, float dipValue) {
float m = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * m + 0.5f);
}
第四步,在剪切完成图片后,切图应用就会将图片通过onActivityResult()返回给我们
通过Bitmap bitmap = data.getParcelableExtra("data");我们就拿到了我们想要的bitmap
接下来拿着这个bitmap你想干嘛就干嘛吧
由于上边的代码涉及到读写sdcard,所以要记得在清单文件中授权
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
附上几张效果图