You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Dart(Flutter)中上传图片时如何压缩/减小图片尺寸?

Flutter/Dart 图片压缩方案(针对5MB图片上传场景)

嘿,刚好我前段时间做项目也碰到了类似的需求——上传大图片前先压缩,不然不仅上传慢,还可能占服务器空间。给你分享两个我亲测好用的方案,都是Flutter生态里比较成熟的工具:

方案一:用 flutter_image_compress 快速实现(推荐)

这个库封装得很到位,能轻松处理图片压缩,支持质量压缩和尺寸压缩,用起来特别省心。

步骤1:添加依赖

在你的 pubspec.yaml 里加上:

dependencies:
  flutter_image_compress: ^1.1.0 # 记得用最新版本哦

然后运行 flutter pub get 完成安装。

步骤2:编写压缩代码

假设你已经获取到了图片的文件路径(比如从相册选择的图片),可以这样写压缩逻辑:

import 'package:flutter_image_compress/flutter_image_compress.dart';
import 'dart:io';

Future<File?> compressImage(String imagePath) async {
  final targetPath = "${Directory.systemTemp.path}/compressed_image.jpg";

  // 开始压缩:这里设置质量为60(范围0-100),也可以按需调整宽高
  final result = await FlutterImageCompress.compressAndGetFile(
    imagePath,
    targetPath,
    quality: 60,
    // 如果需要按固定尺寸压缩,比如缩到1080P
    // width: 1080,
    // height: 1920,
  );

  if (result != null) {
    print("压缩前大小:${File(imagePath).lengthSync() / 1024 / 1024} MB");
    print("压缩后大小:${result.lengthSync() / 1024 / 1024} MB");
    return result;
  }
  return null;
}

步骤3:上传压缩后的图片

拿到压缩后的File对象后,就可以用你常用的上传方法(比如http包)上传了:

import 'package:http/http.dart' as http;

Future<void> uploadCompressedImage(File compressedFile) async {
  var request = http.MultipartRequest(
    'POST',
    Uri.parse('你的上传接口地址'),
  );
  request.files.add(await http.MultipartFile.fromPath('image', compressedFile.path));
  
  var response = await request.send();
  if (response.statusCode == 200) {
    print("上传成功!");
  } else {
    print("上传失败:${response.statusCode}");
  }
}

方案二:用 image 库手动压缩(适合需要精细控制的场景)

如果你需要更底层的控制,比如自定义压缩算法、处理图片像素细节,可以用这个纯Dart的图片处理库。

步骤1:添加依赖

dependencies:
  image: ^4.0.17

步骤2:手动压缩代码

import 'package:image/image.dart' as img;
import 'dart:io';
import 'dart:typed_data';

Future<File?> compressImageManually(String imagePath) async {
  // 读取图片文件
  final bytes = await File(imagePath).readAsBytes();
  final image = img.decodeImage(bytes);
  
  if (image == null) return null;

  // 缩放图片到指定尺寸(比如宽1080,按比例自动调整高度)
  final resizedImage = img.copyResize(image, width: 1080);
  
  // 转换为JPG格式并设置质量
  final compressedBytes = img.encodeJpg(resizedImage, quality: 60);
  
  // 保存到临时文件
  final tempFile = File("${Directory.systemTemp.path}/manual_compressed.jpg");
  await tempFile.writeAsBytes(compressedBytes);
  
  print("手动压缩后大小:${tempFile.lengthSync() / 1024 / 1024} MB");
  return tempFile;
}

一些实用小贴士

  • 质量参数调整:质量值越高,图片越清晰但文件越大,建议测试50-70之间的数值,找到适合你场景的清晰度与大小平衡点。
  • 尺寸压缩优先:如果图片分辨率很高(比如4K),先缩小尺寸再调整质量,压缩效果会更明显。
  • 临时文件处理:压缩后的图片建议存在临时目录,上传完成后记得删除,避免占用设备存储空间。

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

火山引擎 最新活动