Android Image Cropper调用相机后无法获取原始Bitmap,求解决方法
解决android-image-cropper相机源裁剪后获取原始图片的问题
当仅启用相机作为图片源时,调用result.getOriginalBitmap()返回null是因为库不会将相机拍摄的原始图片Bitmap直接缓存到内存中(避免大图片引发内存溢出),此时需要通过原始图片的Uri来加载Bitmap。
解决方案步骤:
- 用
result.getOriginalUri()获取原始图片的Uri,替代直接调用getOriginalBitmap() - 通过Uri自行加载Bitmap,加载时建议添加采样处理,避免内存溢出
修改后的代码示例:
ActivityResultLauncher<CropImageContractOptions> cropImage = registerForActivityResult(new CropImageContract(), result -> { if (result.isSuccessful()) { // 获取并加载裁剪后的图片 croppedBitmap = BitmapFactory.decodeFile(result.getUriFilePath(getApplicationContext(), true)); croppedImageView.setImageBitmap(croppedBitmap); // 获取原始图片Uri并加载Bitmap Uri originalUri = result.getOriginalUri(); if (originalUri != null) { // 添加Bitmap采样逻辑,避免高分辨率图片导致OOM BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; // 根据实际需求调整采样率 try (InputStream is = getContentResolver().openInputStream(originalUri)) { originalBitmap = BitmapFactory.decodeStream(is, null, options); originalImageView.setImageBitmap(originalBitmap); } catch (IOException e) { e.printStackTrace(); } } } }); private void launchCropImage() { CropImageOptions cropImageOptions = new CropImageOptions(); cropImageOptions.imageSourceIncludeGallery = false; cropImageOptions.imageSourceIncludeCamera = true; CropImageContractOptions cropImageContractOptions = new CropImageContractOptions(null, cropImageOptions); cropImage.launch(cropImageContractOptions); }
额外注意事项:
- 若应用目标SDK为33及以上,需申请
READ_MEDIA_IMAGES权限(相机拍摄的临时文件通常在应用私有目录,大概率无需权限,但建议做好权限申请逻辑) - 加载Bitmap时必须做采样处理,尤其是高分辨率相机拍摄的图片,直接加载极易引发内存溢出
- 若需要持久化原始图片,可通过Uri将文件复制到自定义目录
内容的提问来源于stack exchange,提问作者Shashi Ranjan
相关产品推荐
相关产品推荐

