在Android编程中,从相册选取或是拍照选取一张照片然后对其进行剪切的需求非常的多
之前的一篇文章只说到如何从相册中获取一张照片,今天就跟大家说说如何将获取到的相片进行剪切
完整源码下载
我们先说一下思路,在android系统中就自带了图片剪切的应用,所以,我们只需要将我们获取到的相片传给图片剪切应用,再将剪切好的相片返回到我们自己的界面显示就ok了
第一步,我们可以先激活系统图片或是相机来获取相片,看代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/*
* 从相册获取
*/
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);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
@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);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/*
* 剪切图片
*/
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
);
// 裁剪后输出图片的尺寸大小
intent.putExtra(
"outputX"
,
250
);
intent.putExtra(
"outputY"
,
250
);
intent.putExtra(
"outputFormat"
,
"JPEG"
);
// 图片格式
intent.putExtra(
"noFaceDetection"
,
true
);
// 取消人脸识别
intent.putExtra(
"return-data"
,
true
);
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT
startActivityForResult(intent, PHOTO_REQUEST_CUT);
}
|
通过Bitmap bitmap = data.getParcelableExtra("data");我们就拿到了我们想要的bitmap
接下来拿着这个bitmap你想干嘛就干嘛吧
由于上边的代码涉及到读写sdcard,所以要记得在清单文件中授权
1
|
|
附上几张效果图