Flutter图片压缩插件flutter_image_compression的使用

Flutter图片压缩插件flutter_image_compression的使用

本项目是一个用于Flutter的插件项目,它包含针对Android和/或iOS平台的特定实现代码。

开始使用

对于希望开始进行Flutter开发的开发者,可以查看官方文档,其中提供了教程、示例、移动开发指导以及完整的API参考。

使用示例

以下是flutter_image_compression插件的基本使用示例。该示例展示了如何从相册选择一张图片并对其进行压缩。

示例代码

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

void main() {
  runApp(const MaterialApp(home: MainPage()));
}

class MainPage extends StatefulWidget {
  const MainPage({super.key});

  [@override](/user/override)
  _MainPageState createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  Configuration config = const Configuration();
  ImageFile? image;
  ImageFile? imageOutput;
  bool processing = false;

  [@override](/user/override)
  Widget build(BuildContext context) {
    final buttonGallery = ElevatedButton.icon(
      onPressed: handleOpenGallery,
      icon: const Icon(Icons.photo_outlined),
      label: const Text('Pick an Image'),
    );

    final buttonCompress = Padding(
      padding: const EdgeInsets.all(16),
      child: ElevatedButton.icon(
        onPressed: handleCompressImage,
        icon: const Icon(Icons.compress),
        label: const Text('Compress Image'),
      ),
    );

    Widget body = Center(child: buttonGallery);
    if (image != null) {
      final inputImage = Padding(
        padding: const EdgeInsets.symmetric(horizontal: 16),
        child: Image.memory(image!.rawBytes),
      );
      final inputImageSizeType = ListTile(
        title: const Text('Image size-type :'),
        subtitle: Text(
            '${(image!.sizeInBytes / 1024 / 1024).toStringAsFixed(2)} MB - (${image!.width} x ${image!.height})'),
        trailing: Text(image!.extension),
      );
      final inputImageName = ListTile(
        title: const Text('Image name :'),
        subtitle: Text(image!.fileName),
      );

      body = SingleChildScrollView(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            Padding(
              padding: const EdgeInsets.fromLTRB(16, 16, 16, 0),
              child: buttonGallery,
            ),
            const ListTile(title: Text('INPUT IMAGE')),
            inputImage,
            inputImageSizeType,
            inputImageName,
            const Divider(),
            const ListTile(title: Text('OUTPUT IMAGE')),
            configOutputType,
            configQuality,
            nativeCompressorCheckBox,
            buttonCompress,
            processing
                ? const Padding(
                    padding: EdgeInsets.all(16.0),
                    child: LinearProgressIndicator(),
                  )
                : const SizedBox.shrink(),
            if (imageOutput != null && !processing)
              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 16),
                child: Image.memory(imageOutput!.rawBytes),
              ),
            if (imageOutput != null && !processing)
              ListTile(
                title: const Text('Image size-type :'),
                subtitle: Text(
                    '${(imageOutput!.sizeInBytes / 1024 / 1024).toStringAsFixed(2)} MB - (${imageOutput!.width} x ${imageOutput!.height})'),
                trailing: Text(imageOutput!.contentType ?? '-'),
              ),
          ],
        ),
      );
    }

    return Scaffold(
      appBar: AppBar(
        title: const Text('Image Compression'),
      ),
      body: body,
    );
  }

  Widget get nativeCompressorCheckBox {
    return CheckboxListTile(
      title: const Text('Native compressor for JPG/PNG'),
      value: config.useJpgPngNativeCompressor,
      onChanged: (flag) {
        setState(() {
          config = Configuration(
            outputType: config.outputType,
            useJpgPngNativeCompressor: flag ?? false,
            quality: config.quality,
          );
        });
      },
    );
  }

  Widget get configOutputType {
    return ListTile(
      title: const Text('Select output type'),
      subtitle: Text(config.outputType.toString()),
      trailing: PopupMenuButton<ImageOutputType>(
        itemBuilder: (context) {
          return ImageOutputType.values
              .map((e) => PopupMenuItem(
                    value: e,
                    child: Text(e.toString()),
                  ))
              .toList();
        },
        onSelected: (outputType) {
          setState(() {
            config = Configuration(
              outputType: outputType,
              useJpgPngNativeCompressor: config.useJpgPngNativeCompressor,
              quality: config.quality,
            );
          });
        },
      ),
    );
  }

  Widget get configQuality {
    return ListTile(
      title: Text('Select quality (${config.quality})'),
      subtitle: Slider.adaptive(
        value: config.quality.toDouble(),
        divisions: 100,
        min: 0,
        max: 100,
        label: config.quality.toString(),
        onChanged: (value) {
          setState(() {
            config = Configuration(
              outputType: config.outputType,
              useJpgPngNativeCompressor: config.useJpgPngNativeCompressor,
              quality: value.toInt(),
            );
          });
        },
      ),
    );
  }

  handleOpenGallery() async {
    // final xFile = await flimer.pickImage(source: ImageSource.gallery);

    // if (xFile != null) {
    //   final image = await xFile.asImageFile;
    //   setState(() {
    //     this.image = image;
    //   });
    // }
  }

  handleCompressImage() async {
    setState(() {
      processing = true;
    });
    final param = ImageFileConfiguration(input: image!, config: config);
    final output = await compressor.compress(param);

    setState(() {
      imageOutput = output;
      processing = false;
    });
  }
}

更多关于Flutter图片压缩插件flutter_image_compression的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


flutter_image_compression 是一个用于在 Flutter 应用中压缩图片的插件。它可以帮助你减少图片文件的大小,从而优化应用的性能,特别是在需要上传图片到服务器或存储到本地设备时。

以下是如何使用 flutter_image_compression 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 flutter_image_compression 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_image_compression: ^2.0.0  # 请确保使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 flutter_image_compression 插件:

import 'package:flutter_image_compression/flutter_image_compression.dart';

3. 使用插件压缩图片

你可以使用 flutter_image_compression 来压缩图片。以下是一个简单的示例:

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

class ImageCompressionExample extends StatefulWidget {
  @override
  _ImageCompressionExampleState createState() => _ImageCompressionExampleState();
}

class _ImageCompressionExampleState extends State<ImageCompressionExample> {
  File? _compressedImage;

  Future<void> _pickAndCompressImage() async {
    final picker = ImagePicker();
    final pickedFile = await picker.pickImage(source: ImageSource.gallery);

    if (pickedFile != null) {
      final file = File(pickedFile.path);

      // 压缩图片
      final compressedFile = await FlutterImageCompression.compressAndGetFile(
        file.absolute.path,
        file.absolute.path + '_compressed.jpg',  // 压缩后的文件路径
        quality: 50,  // 压缩质量,0-100
      );

      setState(() {
        _compressedImage = compressedFile;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Compression Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            if (_compressedImage != null)
              Image.file(_compressedImage!),
            ElevatedButton(
              onPressed: _pickAndCompressImage,
              child: Text('Pick and Compress Image'),
            ),
          ],
        ),
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: ImageCompressionExample(),
));

4. 解释代码

  • ImagePicker: 用于从设备中选择图片。
  • FlutterImageCompression.compressAndGetFile: 这是 flutter_image_compression 插件的主要方法,用于压缩图片并返回压缩后的文件。
    • 第一个参数是原始图片的路径。
    • 第二个参数是压缩后图片的保存路径。
    • quality 参数用于设置压缩质量,范围是 0 到 100,100 表示最高质量。

5. 运行应用

运行你的应用,点击按钮选择图片并查看压缩后的效果。

6. 其他功能

flutter_image_compression 还提供了其他一些功能,例如:

  • 压缩为字节数组: 你可以使用 FlutterImageCompression.compressWithFile 将图片压缩为字节数组。
  • 设置图片尺寸: 你可以通过 widthheight 参数来调整压缩后图片的尺寸。
final compressedFile = await FlutterImageCompression.compressAndGetFile(
  file.absolute.path,
  file.absolute.path + '_compressed.jpg',
  quality: 50,
  minWidth: 600,  // 最小宽度
  minHeight: 600, // 最小高度
);
回到顶部