Flutter图片缩略图生成插件thumbnailer的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter图片缩略图生成插件thumbnailer的使用

thumbnailer简介

thumbnailer 是一个Flutter插件,能够为图片、PDF和xlsx文件生成缩略图。以下是该插件的一些特性:

  • 如果特定mime类型不支持缩略图生成,则返回来自FontAwesome的回退图标。
  • 支持注册自定义mime类型处理器以实现动态扩展。
  • 生成的缩略图(或回退图标)是Flutter小部件。
  • 支持对结果缩略图进行自定义调整大小/样式。

在创建此插件时,pub.dev上没有可用的解决方案。

使用方法

要使用此插件,请将 thumbnailer 添加为依赖项到您的 pubspec.yaml 文件中。

dependencies:
  thumbnailer: ^latest_version # 替换为最新版本号

示例代码

下面是一个完整的示例应用程序,演示了如何使用thumbnailer插件。这个例子包括了不同的用法场景,如简单的缩略图生成、带有自定义样式的缩略图、针对不同文件类型的处理等。

import 'package:thumbnailer/thumbnailer.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';

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

/// example app demonstrating thumbnailer plugin
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    // 添加自定义mime类型映射
    Thumbnailer.addCustomMimeTypesToIconDataMappings(<String, IconData>{
      'custom/mimeType': FontAwesomeIcons.key,
    });
  }

  final List<Tab> myTabs = <Tab>[
    const Tab(text: 'Icons'),
    const Tab(text: 'Images'),
    const Tab(text: 'Creation Strategies'),
  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Padding(
          padding: const EdgeInsets.symmetric(vertical: 10),
          child: DefaultTabController(
            length: myTabs.length,
            child: Scaffold(
              appBar: AppBar(title: TabBar(tabs: myTabs)),
              body: TabBarView(
                children: <Widget>[
                  // Icons tab content
                  Padding(
                    padding: const EdgeInsets.only(top: 5),
                    child: GridView.count(
                      crossAxisCount: 2,
                      children: <Widget>[
                        Column(
                          children: const <Widget>[
                            Thumbnail(
                              mimeType: 'text/html',
                              widgetSize: 100,
                            ),
                            Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'simplest Thumbnail , only set necessary params (mimeType,widgetSize)',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        // 更多缩略图实例...
                      ],
                    ),
                  ),
                  // Images tab content
                  Padding(
                    padding: const EdgeInsets.only(top: 5),
                    child: GridView.count(
                      crossAxisCount: 2,
                      children: <Widget>[
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              dataResolver: () async {
                                return (await DefaultAssetBundle.of(context)
                                        .load('assets/samples/png-sample.png'))
                                    .buffer
                                    .asUint8List();
                              },
                              mimeType: 'image/png',
                              widgetSize: 100,
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'png image',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        // 更多图像缩略图实例...
                      ],
                    ),
                  ),
                  // Creation Strategies tab content
                  Padding(
                    padding: const EdgeInsets.only(top: 5),
                    child: GridView.count(
                      crossAxisCount: 1,
                      children: <Widget>[
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              dataResolver: () async {
                                return (await DefaultAssetBundle.of(context)
                                        .load('assets/samples/png-sample.png'))
                                    .buffer
                                    .asUint8List();
                              },
                              mimeType: 'image/png',
                              widgetSize: 300,
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'in basic implementation there are 3 creation strategies, 1st is for images',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        // 更多创建策略实例...
                      ],
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

注意事项

  • 添加自定义mime类型:通过 Thumbnailer.addCustomMimeTypesToIconDataMappings 方法可以添加新的mime类型及其对应的图标。
  • 错误处理:可以通过设置 errorBuilder 属性来定义自定义的错误行为。
  • 资源加载:示例中的 dataResolver 函数用于异步加载资源数据。这通常是从网络或本地存储中读取文件内容。

希望这个详细的示例能帮助您更好地理解和使用 thumbnailer 插件!如果您有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用thumbnailer插件来生成图片缩略图的示例代码。需要注意的是,由于thumbnailer并非一个广泛认知的官方或流行Flutter插件,我将以一个假设的thumbnail处理库为例,展示如何在Flutter中进行图片缩略图生成。实际上,你可能需要找到并集成一个具体的第三方库或者自己实现缩略图生成逻辑。

在这个例子中,我们将使用image库来解码和编码图像,以及dart:ui中的Canvas来绘制缩略图。虽然这不是一个名为thumbnailer的插件,但它展示了如何在Flutter中处理图像生成缩略图的基本方法。

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

dependencies:
  flutter:
    sdk: flutter
  image: ^3.0.4  # 请检查最新版本号

然后,你可以使用以下代码来生成图片的缩略图:

import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:image/image.dart' as img;
import 'dart:io';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Image Thumbnail Generator'),
        ),
        body: ThumbnailGenerator(),
      ),
    );
  }
}

class ThumbnailGenerator extends StatefulWidget {
  @override
  _ThumbnailGeneratorState createState() => _ThumbnailGeneratorState();
}

class _ThumbnailGeneratorState extends State<ThumbnailGenerator> {
  Uint8List? thumbnailData;

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          ElevatedButton(
            onPressed: () async {
              // 假设你有一个图片文件路径
              File imageFile = File('path/to/your/image.jpg');
              Uint8List imageData = await imageFile.readAsBytes();
              img.Image? image = img.decodeImage(imageData);

              if (image != null) {
                // 生成缩略图
                int width = image.width ~/ 4; // 缩小到原来的1/4宽度
                int height = image.height ~/ 4; // 缩小到原来的1/4高度
                img.Image thumbnailImage = img.copyResize(image, width: width, height: height);

                // 编码为Uint8List
                Uint8List thumbnailBytes = Uint8List.fromList(img.encodeJpg(thumbnailImage, quality: 85));

                // 更新状态
                setState(() {
                  thumbnailData = thumbnailBytes;
                });
              }
            },
            child: Text('Generate Thumbnail'),
          ),
          if (thumbnailData != null)
            Image.memory(thumbnailData!),
        ],
      ),
    );
  }
}

在这个例子中,我们做了以下几件事:

  1. 使用image库来解码和编码图像。
  2. 读取一个本地图片文件并将其解码为img.Image对象。
  3. 使用img.copyResize方法将图像缩放到指定的宽度和高度。
  4. 使用img.encodeJpg方法将缩小的图像编码为JPEG格式的Uint8List
  5. 使用Image.memory在Flutter UI中显示生成的缩略图。

请注意,你需要替换'path/to/your/image.jpg'为你的实际图片文件路径。此外,这个示例使用了JPEG格式进行编码,你可以根据需要选择其他格式(如PNG)。

如果你确实在寻找一个名为thumbnailer的特定Flutter插件,请确保它存在于pub.dev上,并按照其文档进行集成和使用。如果这样的插件不存在,上述方法提供了一种在Flutter中生成图片缩略图的通用方式。

回到顶部