在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




