Android 图片选择与裁剪实战指南

5星 · 超过95%的资源 6 下载量 181 浏览量 更新于2024-08-29 收藏 64KB PDF 举报
"这篇资源是关于在Android应用中实现拍照和从图库选择图片,并进行裁剪的功能。作者通过阅读《第一行代码》并结合网络资料,创建了一个简单的示例Demo来演示这一过程。" 在Android开发中,经常需要集成拍照、从图库选择图片以及对图片进行裁剪的功能。以下是如何实现这些功能的详细步骤: 一、拍照选择图片 1. 启动相机应用: 要启动系统的相机应用,可以创建一个隐式Intent,指定动作为`MediaStore.ACTION_IMAGE_CAPTURE`。这样,系统会寻找能够处理此动作的应用(通常是相机应用): ```java Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1); ``` 这里的`1`是请求码,用于在回调方法中区分不同的操作。 2. 处理相机返回的结果: 当用户拍照完成后,可以通过`onActivityResult`方法接收结果。如果用户取消了拍照,`data`对象将为`null`;否则,可以从`data.getExtras()`中获取拍好的照片`Bitmap`: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1 && resultCode == RESULT_OK) { if (data != null) { Bundle extras = data.getExtras(); if (extras != null) { Bitmap bitmap = extras.getParcelable("data"); // 这里可以对bitmap进行进一步处理,如显示到ImageView等 } } } } ``` 二、从图库选择图片 1. 打开图库: 要让用户从图库中选择图片,同样需要创建一个隐式Intent,但这次指定动作为`Intent.ACTION_GET_CONTENT`,并设置类型为图片: ```java Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivityForResult(intent, 2); // 2 作为请求码 ``` 2. 处理图片选择结果: 在`onActivityResult`中,可以获取到用户选择图片的`Uri`: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 2 && resultCode == RESULT_OK) { if (data != null) { Uri selectedImageUri = data.getData(); // 可以使用这个Uri进行后续处理,如加载图片到ImageView等 } } } ``` 三、裁剪选择的图片 从相机或图库获取的图片可能需要裁剪以适应特定的尺寸或比例。首先,我们需要将图片保存到本地,然后创建一个新的Intent启动裁剪应用: 1. 将Bitmap保存为文件并获取Uri: ```java private Uri saveBitmap(Bitmap bitmap, String dirPath) { File tmpDir = new File(Environment.getExternalStorageDirectory() + "/" + dirPath); if (!tmpDir.exists()) { tmpDir.mkdirs(); } File imageFile = new File(tmpDir, "temp_image.jpg"); try { FileOutputStream out = new FileOutputStream(imageFile); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); out.close(); } catch (IOException e) { e.printStackTrace(); } return Uri.fromFile(imageFile); } ``` 2. 启动图片裁剪: 创建一个显式Intent,使用`CropIntentProvider`类(通常自定义或使用第三方库如`android-crop`),指定输入Uri和裁剪后的输出Uri: ```java Intent cropIntent = new Intent(this, CropImageActivity.class); cropIntent.setDataAndType(selectedImageUri, "image/*"); cropIntent.putExtra(CropImageActivity.EXTRA_OUTPUT_URI, saveBitmap(bitmap, "CroppedImages")); startActivityForResult(cropIntent, 3); // 3 作为裁剪请求码 ``` 3. 处理裁剪结果: 在裁剪完成后,从裁剪应用返回的结果中获取裁剪后的图片Uri,然后可以加载到应用中: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 3 && resultCode == RESULT_OK) { Uri croppedImageUri = data.getData(); // 加载裁剪后的图片到ImageView等 } } ``` 以上就是Android应用中实现拍照、从图库选择图片并进行裁剪的基本流程。实际开发时,可能还需要考虑权限管理、图片压缩、异常处理等细节问题。