Flutter如何实现图片压缩

在Flutter中如何实现图片压缩?我想在上传图片前减小文件大小,但不知道具体该用什么插件或方法。目前尝试过ImagePicker选图,但原图体积太大直接上传很慢。有没有推荐的压缩方案?最好能控制压缩质量和支持批量处理。

2 回复

Flutter中可使用flutter_image_compress库实现图片压缩。通过compressAndGetFile方法,可调整质量、尺寸等参数,简单高效。

更多关于Flutter如何实现图片压缩的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中实现图片压缩,可以通过以下方法:

1. 使用image_picker插件(推荐)

import 'package:image_picker/image_picker.dart';

// 选择并压缩图片
Future<XFile?> pickAndCompressImage() async {
  final ImagePicker picker = ImagePicker();
  
  // 选择图片时直接设置压缩质量
  final XFile? image = await picker.pickImage(
    source: ImageSource.gallery,
    maxWidth: 800,      // 最大宽度
    maxHeight: 800,     // 最大高度
    imageQuality: 70,   // 压缩质量 (0-100)
  );
  
  return image;
}

2. 使用flutter_image_compress插件

import 'package:flutter_image_compress/flutter_image_compress.dart';

// 压缩图片文件
Future<XFile?> compressImage(File file) async {
  final result = await FlutterImageCompress.compressAndGetFile(
    file.absolute.path,
    '${file.path}_compressed.jpg',
    quality: 70,           // 压缩质量
    minWidth: 800,         // 最小宽度
    minHeight: 800,        // 最小高度
    rotate: 0,             // 旋转角度
  );
  
  return result;
}

3. 完整示例

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';

class ImageCompressExample extends StatefulWidget {
  @override
  _ImageCompressExampleState createState() => _ImageCompressExampleState();
}

class _ImageCompressExampleState extends State<ImageCompressExample> {
  XFile? _compressedImage;

  Future<void> _pickImage() async {
    final ImagePicker picker = ImagePicker();
    final XFile? image = await picker.pickImage(
      source: ImageSource.gallery,
      maxWidth: 800,
      maxHeight: 800,
      imageQuality: 70,
    );
    
    setState(() {
      _compressedImage = image;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            if (_compressedImage != null)
              Image.file(File(_compressedImage!.path)),
            ElevatedButton(
              onPressed: _pickImage,
              child: Text('选择并压缩图片'),
            ),
          ],
        ),
      ),
    );
  }
}

主要参数说明:

  • maxWidth/maxHeight: 限制图片尺寸
  • imageQuality: 压缩质量 (0-100,数值越小压缩越厉害)
  • minWidth/minHeight: 最小尺寸限制

依赖配置:

pubspec.yaml 中添加:

dependencies:
  image_picker: ^1.0.4
  flutter_image_compress: ^1.1.3

选择图片时直接使用 image_picker 的压缩参数是最简单的方法,如果需要更精细的控制,可以使用 flutter_image_compress 插件。

回到顶部