You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:12:21