Android 图片获取与裁剪实战教程
66 浏览量
更新于2024-08-30
收藏 59KB PDF 举报
"Android实现拍照、选择相册图片并裁剪功能"
在Android应用开发中,经常需要集成拍照、从相册选取图片以及裁剪图片的功能。这些功能可以帮助用户自定义头像、上传图片等。以下是如何在Android应用中实现这一系列操作的详细步骤。
首先,你需要创建一个Activity,例如`UploadPicActivity`,继承自`Activity`并实现`View.OnClickListener`接口,以便处理按钮点击事件。在布局文件`activity_upload_pic.xml`中,你需要添加用于触发拍照、选择相册图片以及显示图片的按钮和ImageView控件。在`UploadPicActivity`的`onCreate`方法中,初始化这些视图并设置点击监听器。
```java
public class UploadPicActivity extends Activity implements View.OnClickListener {
private Button take_photo_btn;
private Button select_photo_btn;
private ImageView photo_iv;
// 定义常量
public static final int TAKE_PHOTO_CODE = 1;
public static final int SELECT_PIC_CODE = 2;
public static final int PHOTO_CROP_CODE = 3;
// 图片Uri和路径变量
private Uri photoUri;
private String picPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upload_pic);
initViews();
}
private void initViews() {
this.take_photo_btn = (Button) findViewById(R.id.take_photo_btn);
this.take_photo_btn.setOnClickListener(this);
this.select_photo_btn = (Button) findViewById(R.id.select_photo_btn);
this.select_photo_btn.setOnClickListener(this);
this.photo_iv = (ImageView) findViewById(R.id.photo_iv);
}
// ...
}
```
接着,实现`onClick`方法来处理按钮点击事件。当用户点击“拍照”按钮时,启动相机应用:
```java
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.take_photo_btn:
takePhoto();
break;
case R.id.select_photo_btn:
selectPicture();
break;
// ...
}
}
private void takePhoto() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// 创建保存图片的临时文件
File photoFile = null;
try {
photoFile = createImageFile();
photoUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", photoFile);
} catch (IOException e) {
e.printStackTrace();
}
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(takePictureIntent, TAKE_PHOTO_CODE);
}
}
}
private File createImageFile() throws IOException {
// 创建文件名
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
picPath = image.getAbsolutePath();
return image;
}
```
对于“从相册选择”按钮,启动系统图库:
```java
private void selectPicture() {
Intent pickPictureIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
if (pickPictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(pickPictureIntent, SELECT_PIC_CODE);
}
}
```
当拍照或选择图片后,重写`onActivityResult`方法,处理返回的结果并裁剪图片:
```java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == TAKE_PHOTO_CODE || requestCode == SELECT_PIC_CODE) {
cropPhoto();
} else if (requestCode == PHOTO_CROP_CODE) {
displayPhoto();
}
}
}
private void cropPhoto() {
Intent cropIntent = new Intent("com.android.camera.action.CROP");
cropIntent.setDataAndType(photoUri, "image/*");
cropIntent.putExtra("crop", "true");
cropIntent.putExtra("aspectX", 1);
cropIntent.putExtra("aspectY", 1);
cropIntent.putExtra("outputX", 256);
cropIntent.putExtra("outputY", 256);
cropIntent.putExtra("return-data", true);
startActivityForResult(cropIntent, PHOTO_CROP_CODE);
}
private void displayPhoto() {
Bundle extras = data.getExtras();
Bitmap bitmap = extras.getParcelable("data");
photo_iv.setImageBitmap(bitmap);
}
```
注意,使用相机拍照时,为了兼容Android 7.0以上版本的安全性,我们需要使用`FileProvider`来提供图片Uri。同时,裁剪图片的部分可能需要依赖第三方库如`android-crop`。
最后,如果需要将裁剪后的图片上传到服务器,可以使用各种HTTP客户端库(如OkHttp)来实现。通常,你需要将图片转换为二进制流,然后通过POST请求发送到服务器。记得在上传前对图片进行压缩,以减少网络传输的数据量。
以上就是Android应用中实现拍照、选择相册图片并裁剪功能的基本步骤,这个功能在很多社交类或者个人信息编辑类应用中都非常常见。通过这些代码,你可以为用户提供便捷的图片处理体验。
2017-02-06 上传
2020-08-30 上传
2021-01-20 上传
2015-11-04 上传
2016-05-05 上传
2022-09-29 上传
156 浏览量
2017-12-15 上传
weixin_38704857
- 粉丝: 10
- 资源: 895
最新资源
- stm32学习代码.zip
- Python自动化神器-PyAutoGUI(1)
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
- torch_scatter-2.0.7-cp39-cp39-win_amd64whl.zip
- torch_cluster-1.5.9-cp39-cp39-win_amd64whl.zip
- torch_scatter-2.0.7-cp39-cp39-linux_x86_64whl.zip
- torch_cluster-1.5.9-cp39-cp39-linux_x86_64whl.zip
- torch_scatter-2.0.8-cp39-cp39-win_amd64whl.zip
- torch_scatter-2.0.7-cp38-cp38-win_amd64whl.zip
- torch_scatter-2.0.9-cp39-cp39-win_amd64whl.zip
- torch_cluster-1.5.9-cp38-cp38-win_amd64whl.zip
- torch_scatter-2.0.8-cp38-cp38-win_amd64whl.zip
- torch_scatter-2.0.7-cp38-cp38-linux_x86_64whl.zip
- torch_cluster-1.5.9-cp37-cp37m-win_amd64whl.zip
- torch_scatter-2.0.9-cp39-cp39-linux_x86_64whl.zip
- torch_scatter-2.0.7-cp37-cp37m-linux_x86_64whl.zip