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

Flutter中XFile格式图片是否比File格式画质更低?Camera插件拍摄图片后展示模糊问题求助

Flutter Camera Plugin Captured Image Blurry Issue - Root Cause & Fix

Hey there! Let's break down why your captured images are getting so blurry, and how to fix it right away. The problem isn't related to XFile format or the Camera plugin itself—it's happening in your image processing step, where you're accidentally shrinking the image way too much before passing it to the next screen.

The Culprit in Your Code

Take a look at your saveImageToDisk function—this line is the main cause:

Img.Image mImage = Img.copyResizeCropSquare(image, 224);

This code takes your high-resolution captured photo, crops it to a square, and forces it down to a tiny 224x224 pixel size. When you display this tiny image with Image.file(), it gets stretched to fit your screen, resulting in that pixelated, blurry look you're seeing.

Fixes to Restore Image Quality

1. Remove Unnecessary Scaling (Quickest Fix)

If you don't need to shrink the image for things like uploads or storage, just delete that scaling line entirely. Here's the updated saveImageToDisk function:

Future<File> saveImageToDisk(Map pathAndDirectory) async {
  try {
    String path = pathAndDirectory['path'];
    Directory directory = pathAndDirectory['directory'];
    File tempFile = File(path);
    Img.Image? image = Img.decodeImage(tempFile.readAsBytesSync());
    if (image == null) throw ('Error: Could not decode image');
    
    // Remove the 224x224 scaling line here
    String imgType = path.split('.').last;
    String mPath = '${directory.path.toString()}/image_${DateTime.now()}.$imgType';
    mPath = mPath.replaceAll(
      new RegExp(r"\s+\b|\b\s"),
      ""
    );
    File dFile = File(mPath);
    
    if (imgType == 'jpg' || imgType == 'jpeg') {
      dFile.writeAsBytesSync(Img.encodeJpg(image)); // Encode the original image
    } else {
      dFile.writeAsBytesSync(Img.encodePng(image));
    }
    return dFile;
  } catch (e) {
    rethrow;
  }
}

2. Scale Responsively (If You Need Compression)

If you do need to compress the image (e.g., for faster uploads), don't use a fixed tiny size like 224. Instead, scale it proportionally to a reasonable resolution, like matching your screen width or a standard photo size:

// Example: Scale to 1080px wide, keep aspect ratio
Img.Image mImage = Img.copyResize(image, width: 1080);

3. Tweak Display for Better Quality

In your PhotoTakenScreen, make sure you're using a BoxFit that doesn't over-stretch the image. BoxFit.contain will keep the image's original aspect ratio without forcing it to fill the entire screen:

Image.file(
  File(widget.imagePath),
  fit: BoxFit.contain,
)

Why Your Previous Fixes Didn't Work

The delays and device swaps you tried were targeting the capture phase, but the blur happens after the photo is taken—during the image resizing step. That's why those changes didn't make a difference.

Quick Verification Step

After fixing the code, check the resolution of the savedImage in your debug logs. It should match the original resolution from your camera (e.g., 1920x1080 or higher) instead of 224x224. When you display this image, it'll look just as sharp as the camera preview.

内容的提问来源于stack exchange,提问作者SAM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:48:14