Android相机拍照保存后画质劣化问题求助
解决相机拍摄保存后画质劣化问题
核心问题原因:
使用MediaStore.ACTION_IMAGE_CAPTURE时,默认只会返回缩略图(低分辨率Bitmap),而非相机拍摄的高清原图。你后续的保存逻辑基于这个低分辨率Bitmap处理,所以无论怎么调整压缩质量,最终得到的图片分辨率都极低。
步骤1:修改相机调用逻辑,指定原图保存路径
调用相机时,通过MediaStore.EXTRA_OUTPUT参数指定原图的保存Uri,这样相机会直接将高清原图写入该路径,而非返回缩略图。
if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { // 创建保存原图的文件目录 File imagesFolder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyApp"); if (!imagesFolder.exists()) { imagesFolder.mkdirs(); } // 生成唯一文件名 String fileName = "MyImage_" + System.currentTimeMillis() + ".jpg"; File imageFile = new File(imagesFolder, fileName); // Android 7.0+ 使用FileProvider获取Uri Uri imageUri = FileProvider.getUriForFile(this, "com.your.package.fileprovider", imageFile); // 替换为你的应用包名+fileprovider Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); // 保存文件路径,用于后续扫描图库 savedImagePath = imageFile.getAbsolutePath(); imagePickerLauncher.launch(cameraIntent); }
注意:Android 7.0及以上必须配置
FileProvider,否则会抛出FileUriExposedException。需在Manifest中添加Provider配置,并指定xml文件定义可访问的目录。
步骤2:直接扫描原图至图库
相机会将高清原图直接写入你指定的路径,无需再处理Bitmap,只需调用MediaScanner将文件加入系统图库:
// 在imagePickerLauncher的回调中执行扫描操作 private final ActivityResultLauncher<Intent> imagePickerLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && savedImagePath != null) { MediaScannerConnection.scanFile(this, new String[]{savedImagePath}, new String[]{"image/jpeg"}, (path, uri) -> { Log.i("ExternalStorage", "Scanned " + path + ":"); Log.i("ExternalStorage", "-> uri=" + uri); }); } });
额外优化提示
- 若需对原图进行压缩或裁剪,直接读取
savedImagePath对应的文件,使用BitmapFactory.Options的inSampleSize参数采样后处理,避免加载完整大图导致OOM。 - 移除原代码中基于缩略图Bitmap的缩放逻辑,因为源Bitmap本身就是低分辨率的,处理后无法恢复画质。
内容的提问来源于stack exchange,提问作者Mr_JEY
相关产品推荐
相关产品推荐

