flutter如何实现选择图片后进行压缩

在Flutter中,如何实现用户选择图片后自动进行压缩?目前我用了image_picker选择图片,但需要在上传前减小文件体积。希望能支持调整压缩质量(如50%-80%),同时保持图片清晰度。是否有推荐的三方库或原生方法?最好能提供具体代码示例说明压缩流程。

2 回复

使用image_picker选择图片,再通过flutter_image_compress库进行压缩。示例代码:

import 'package:flutter_image_compress/flutter_image_compress.dart';

// 选择图片
XFile? image = await ImagePicker().pickImage(source: ImageSource.gallery);

// 压缩图片
List<int>? result = await FlutterImageCompress.compressWithFile(
  image!.path,
  quality: 50, // 压缩质量(0-100)
  minWidth: 500, // 最小宽度
  minHeight: 500, // 最小高度
);

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


在Flutter中实现选择图片后进行压缩,可以使用以下方法:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  image_picker: ^1.0.4
  image: ^4.0.17

2. 实现代码

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

class ImageCompressor {
  static final ImagePicker _picker = ImagePicker();

  // 选择并压缩图片
  static Future<File?> pickAndCompressImage() async {
    try {
      // 选择图片
      final XFile? pickedFile = await _picker.pickImage(
        source: ImageSource.gallery,
      );

      if (pickedFile == null) return null;

      // 压缩图片
      return await compressImage(File(pickedFile.path));
    } catch (e) {
      print('选择图片失败: $e');
      return null;
    }
  }

  // 压缩图片
  static Future<File> compressImage(File file) async {
    // 读取原始图片
    final List<int> imageBytes = await file.readAsBytes();
    
    // 解码图片
    final img.Image? originalImage = img.decodeImage(imageBytes);
    if (originalImage == null) throw Exception('图片解码失败');

    // 计算压缩尺寸(保持宽高比)
    int targetWidth = 800;
    int targetHeight = (originalImage.height * targetWidth / originalImage.width).toInt();

    // 调整尺寸
    final img.Image resizedImage = img.copyResize(
      originalImage,
      width: targetWidth,
      height: targetHeight,
    );

    // 编码为JPEG格式,质量75%
    final List<int> compressedBytes = img.encodeJpg(resizedImage, quality: 75);

    // 保存压缩后的图片
    final String compressedPath = '${file.parent.path}/compressed_${DateTime.now().millisecondsSinceEpoch}.jpg';
    final File compressedFile = File(compressedPath);
    await compressedFile.writeAsBytes(compressedBytes);

    return compressedFile;
  }
}

3. 使用示例

// 在按钮点击事件中调用
void _pickImage() async {
  File? compressedImage = await ImageCompressor.pickAndCompressImage();
  if (compressedImage != null) {
    print('压缩后的图片路径: ${compressedImage.path}');
    // 更新UI显示压缩后的图片
    setState(() {
      _compressedImageFile = compressedImage;
    });
  }
}

主要特点:

  • 自动调整尺寸:将图片宽度限制在800px以内
  • 质量压缩:JPEG质量设置为75%
  • 保持宽高比:压缩时不会变形
  • 文件大小显著减小:通常可减少70-80%的文件大小

你可以根据需要调整 targetWidthquality 参数来控制压缩程度。

回到顶部