Flutter高效图片压缩与缩放插件jpeg_turbo_resizer的使用

Flutter高效图片压缩与缩放插件jpeg_turbo_resizer的使用

特性

  • 高效的JPEG图像缩放
  • 支持Windows平台
  • 简单的API便于集成
  • 用户友好的图像选择和输出指定

支持的文件类型

该插件使用libjpeg-turbo库,主要支持JPEG文件格式。具体来说,它可以处理:

  • JPEG (.jpg, .jpeg)
  • JPEG 2000 (.jp2, .j2k) - 只读支持
  • JFIF (.jfif)

注意:虽然libjpeg-turbo可以读取其他格式如PPM、BMP和TIFF,但此插件目前专注于JPEG处理。未来更新可能会扩展对更多输入格式的支持。

安装

pubspec.yaml文件中添加以下依赖项:

dependencies:
  jpeg_turbo_resizer: ^0.0.1
  file_picker: ^5.2.10
  path_provider: ^2.0.15

然后运行:

flutter pub get

使用方法

在Dart代码中导入必要的包:

import 'package:jpeg_turbo_resizer/jpeg_turbo_resizer.dart';
import 'package:file_picker/file_picker.dart';
import 'package:path_provider/path_provider.dart';

要对JPEG图像进行缩放:

JpegTurboResizer turboResizer = JpegTurboResizer();
final result = await turboResizer.resizeJpeg(
  inputPath,
  outputPath,
  300,  // 最大分辨率
);

if (result == 0) {
  print('图像缩放成功!');
} else {
  print('图像缩放错误: $result');
}

示例

以下是一个交互式小部件,演示如何使用该插件:

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:jpeg_turbo_resizer/jpeg_turbo_resizer.dart';
import 'package:file_picker/file_picker.dart';
import 'package:path_provider/path_provider.dart';

class ResizeImageWidget extends StatefulWidget {
  [@override](/user/override)
  _ResizeImageWidgetState createState() => _ResizeImageWidgetState();
}

class _ResizeImageWidgetState extends State<ResizeImageWidget> {
  String? _inputImagePath;
  String? _resizedImagePath;
  String _outputFileName = 'resized_image.jpg';
  final _formKey = GlobalKey<FormState>();

  Future<void> _pickImage() async {
    FilePickerResult? result = await FilePicker.platform.pickFiles(
      type: FileType.custom,
      allowedExtensions: ['jpg', 'jpeg', 'jp2', 'j2k', 'jfif'],
    );

    if (result != null) {
      setState(() {
        _inputImagePath = result.files.single.path;
      });
    }
  }

  Future<void> _resizeImage() async {
    if (_formKey.currentState!.validate() && _inputImagePath != null) {
      final directory = await getApplicationDocumentsDirectory();
      final outputPath = '${directory.path}/$_outputFileName';

      JpegTurboResizer turboResizer = JpegTurboResizer();
      final result = await turboResizer.resizeJpeg(
        _inputImagePath!,
        outputPath,
        300,  // 最大分辨率
      );

      if (result == 0) {
        setState(() {
          _resizedImagePath = outputPath;
        });
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('图像缩放成功!')),
        );
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('图像缩放错误: $result')),
        );
      }
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('JPEG Turbo Resizer 示例'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            ElevatedButton.icon(
              onPressed: _pickImage,
              icon: Icon(Icons.image),
              label: Text('选择图像'),
            ),
            SizedBox(height: 16),
            if (_inputImagePath != null) ...[
              Text('已选图像:', style: TextStyle(fontWeight: FontWeight.bold)),
              Text(_inputImagePath!),
              SizedBox(height: 16),
              Image.file(
                File(_inputImagePath!),
                height: 200,
                fit: BoxFit.cover,
              ),
              SizedBox(height: 16),
              ElevatedButton.icon(
                onPressed: _resizeImage,
                icon: Icon(Icons.photo_size_select_large),
                label: Text('缩放图像'),
              ),
              SizedBox(height: 16),
              if (_resizedImagePath != null) ...[
                Text('已缩放图像:', style: TextStyle(fontWeight: FontWeight.bold)),
                Text(_resizedImagePath!),
                SizedBox(height: 16),
                Image.file(
                  File(_resizedImagePath!),
                  height: 200,
                  fit: BoxFit.cover,
                ),
              ],
            ],
          ],
        ),
      ),
    );
  }
}

要使用这个小部件,只需将其添加到你的应用的小部件树中:

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('JPEG Turbo Resizer 示例')),
        body: ResizeImageWidget(),
      ),
    );
  }
}

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

1 回复

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


jpeg_turbo_resizer 是一个高效的 Flutter 插件,专门用于 JPEG 图像的压缩和缩放。它基于 libjpeg-turbo,这是一个高度优化的 JPEG 图像处理库,能够在保证图像质量的同时,显著提高处理速度。

安装

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

dependencies:
  flutter:
    sdk: flutter
  jpeg_turbo_resizer: ^0.0.1 # 请查看最新版本

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

基本用法

1. 压缩 JPEG 图像

你可以使用 JpegTurboResizer.compressJpeg 方法来压缩 JPEG 图像。以下是一个简单的示例:

import 'dart:io';
import 'package:jpeg_turbo_resizer/jpeg_turbo_resizer.dart';

void compressImage(File inputFile, File outputFile) async {
  // 设置压缩质量 (0 - 100)
  int quality = 80;

  // 压缩图像
  Uint8List compressedImage = await JpegTurboResizer.compressJpeg(
    inputFile.readAsBytesSync(),
    quality: quality,
  );

  // 将压缩后的图像写入输出文件
  outputFile.writeAsBytesSync(compressedImage);
}

2. 缩放 JPEG 图像

你可以使用 JpegTurboResizer.resizeJpeg 方法来缩放 JPEG 图像。以下是一个简单的示例:

import 'dart:io';
import 'package:jpeg_turbo_resizer/jpeg_turbo_resizer.dart';

void resizeImage(File inputFile, File outputFile) async {
  // 设置缩放后的宽度和高度
  int width = 800;
  int height = 600;

  // 缩放图像
  Uint8List resizedImage = await JpegTurboResizer.resizeJpeg(
    inputFile.readAsBytesSync(),
    width: width,
    height: height,
  );

  // 将缩放后的图像写入输出文件
  outputFile.writeAsBytesSync(resizedImage);
}

高级用法

1. 保持宽高比

在缩放图像时,你可以选择保持宽高比。以下是一个示例:

import 'dart:io';
import 'package:jpeg_turbo_resizer/jpeg_turbo_resizer.dart';

void resizeImageWithAspectRatio(File inputFile, File outputFile) async {
  // 设置缩放后的宽度
  int width = 800;

  // 缩放图像并保持宽高比
  Uint8List resizedImage = await JpegTurboResizer.resizeJpeg(
    inputFile.readAsBytesSync(),
    width: width,
    maintainAspectRatio: true,
  );

  // 将缩放后的图像写入输出文件
  outputFile.writeAsBytesSync(resizedImage);
}
回到顶部