Flutter图片压缩插件bemeli_compress的使用

Flutter 图片压缩插件 bemeli_compress 的使用

安装

要将 bemeli_compress 添加为您的 Flutter 项目的依赖项,请按照以下步骤操作:

  1. 在命令行中运行:
    flutter pub add bemeli_compress
    
  2. 或者手动在 pubspec.yaml 文件中添加依赖项:
    dependencies:
      bemeli_compress: ^2.4.0
    

然后,在您的 Dart 代码中导入该包:

import 'package:bemeli_compress/bemeli_compress.dart';

使用

以下是一个完整的示例,展示了如何使用 bemeli_compress 插件来压缩图片。

import 'dart:io';

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Image Compressor',
      home: ImageCompressorPage(),
    );
  }
}

class ImageCompressorPage extends StatefulWidget {
  @override
  _ImageCompressorPageState createState() => _ImageCompressorPageState();
}

class _ImageCompressorPageState extends State<ImageCompressorPage> {
  final ImagePicker _picker = ImagePicker();
  File? _image;

  Future<void> _pickImage() async {
    final XFile? pickedFile = await _picker.pickImage(source: ImageSource.gallery);
    if (pickedFile != null) {
      setState(() {
        _image = File(pickedFile.path);
      });
    }
  }

  Future<void> _compressImage() async {
    if (_image == null) return;

    final compressedImage = await BemeliCompress.compressFile(
      _image!,
      quality: 80, // 质量范围 0-100
    );

    if (compressedImage != null) {
      setState(() {
        _image = compressedImage;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Compressor'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _image != null
                ? Image.file(_image!)
                : Text('No image selected.'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _pickImage,
              child: Text('Pick Image'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _compressImage,
              child: Text('Compress Image'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们首先使用 ImagePicker 从相册中选择一张图片。然后,我们调用 BemeliCompress.compressFile 方法来压缩选中的图片。compressFile 方法接受一个 File 对象,并返回一个压缩后的 File 对象。

代码解释

  1. 导入必要的库

    import 'dart:io';
    import 'package:flutter/material.dart';
    import 'package:bemeli_compress/bemeli_compress.dart';
    
  2. 定义主应用

    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Image Compressor',
          home: ImageCompressorPage(),
        );
      }
    }
    
  3. 定义页面状态

    class _ImageCompressorPageState extends State<ImageCompressorPage> {
      final ImagePicker _picker = ImagePicker();
      File? _image;
    
      Future<void> _pickImage() async {
        final XFile? pickedFile = await _picker.pickImage(source: ImageSource.gallery);
        if (pickedFile != null) {
          setState(() {
            _image = File(pickedFile.path);
          });
        }
      }
    
      Future<void> _compressImage() async {
        if (_image == null) return;
    
        final compressedImage = await BemeliCompress.compressFile(
          _image!,
          quality: 80, // 质量范围 0-100
        );
    
        if (compressedImage != null) {
          setState(() {
            _image = compressedImage;
          });
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Image Compressor'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                _image != null
                    ? Image.file(_image!)
                    : Text('No image selected.'),
                SizedBox(height: 20),
                ElevatedButton(
                  onPressed: _pickImage,
                  child: Text('Pick Image'),
                ),
                SizedBox(height: 20),
                ElevatedButton(
                  onPressed: _compressImage,
                  child: Text('Compress Image'),
                ),
              ],
            ),
          ),
        );
      }
    }
    

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

1 回复

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


当然,以下是如何在Flutter项目中使用bemeli_compress插件进行图片压缩的示例代码。这个插件可以帮助你轻松地在Flutter应用中实现图片压缩功能。

首先,确保你已经在pubspec.yaml文件中添加了bemeli_compress依赖:

dependencies:
  flutter:
    sdk: flutter
  bemeli_compress: ^最新版本号  # 请替换为最新的版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中使用bemeli_compress进行图片压缩。以下是一个完整的示例,包括从设备选择图片、压缩图片以及显示压缩前后的图片大小:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  File? _imageFile;
  File? _compressedImageFile;

  final ImagePicker _picker = ImagePicker();

  Future<void> _pickImage() async {
    final pickedFile = await _picker.pickImage(source: ImageSource.gallery);

    if (pickedFile != null) {
      setState(() {
        _imageFile = File(pickedFile.path);
      });

      _compressImage(pickedFile.path);
    }
  }

  Future<void> _compressImage(String imagePath) async {
    final options = CompressOptions(
      quality: 80, // 压缩质量,范围0-100
      resizeWidth: 1920, // 压缩后的宽度,可选
      resizeHeight: 1080, // 压缩后的高度,可选
      resizeMethod: ResizeMethod.cover, // 缩放方法
    );

    final result = await BemeliCompress.compressFile(imagePath, options: options);

    if (result != null) {
      setState(() {
        _compressedImageFile = File(result.path);
      });

      // 打印压缩前后文件大小
      print("Original size: ${_imageFile!.lengthSync()} bytes");
      print("Compressed size: ${_compressedImageFile!.lengthSync()} bytes");
    } else {
      print("Compression failed");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Compression Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _pickImage,
              child: Text('Pick Image'),
            ),
            SizedBox(height: 20),
            if (_imageFile != null)
              Image.file(_imageFile!, width: 300, height: 300),
            SizedBox(height: 20),
            if (_compressedImageFile != null)
              Image.file(_compressedImageFile!, width: 300, height: 300),
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖安装:确保在pubspec.yaml中添加了bemeli_compressimage_picker依赖。
  2. UI设计:创建一个简单的UI,包含一个按钮用于选择图片,以及两个Image.file用于显示原始图片和压缩后的图片。
  3. 图片选择:使用ImagePicker插件从设备图库中选择图片。
  4. 图片压缩:使用BemeliCompress.compressFile方法进行图片压缩,并设置压缩选项,如质量、宽度、高度和缩放方法。
  5. 显示结果:在UI上显示原始图片和压缩后的图片,并打印压缩前后的文件大小。

这个示例代码展示了如何在Flutter应用中使用bemeli_compress插件进行图片压缩,并展示了压缩前后的图片和大小变化。你可以根据需要进一步自定义和扩展这个示例。

回到顶部