Flutter颜色提取插件color_thief_flutter的使用

color_thief_flutter是一个基于 Dart 的 Flutter 颜色提取插件,其灵感来源于 color-thief,并依赖于 quantize_dart。该插件可以帮助开发者从图像中提取主色调或生成颜色调色板。


使用方法

引入插件

首先,在 pubspec.yaml 文件中添加依赖:

dependencies:
  color_thief_flutter: ^x.x.x

然后运行以下命令以更新依赖:

flutter pub get

接下来在代码中导入插件:

import 'package:color_thief_flutter/color_thief_flutter.dart';
import 'package:color_thief_flutter/utils.dart';

示例代码

以下是一个完整的示例,展示了如何使用 color_thief_flutter 提取颜色和调色板。

import 'package:color_thief_flutter/color_thief_flutter.dart';
import 'package:color_thief_flutter/utils.dart';
import 'package:flutter/material.dart';

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

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

class ColorExtractionPage extends StatefulWidget {
  @override
  _ColorExtractionPageState createState() => _ColorExtractionPageState();
}

class _ColorExtractionPageState extends State<ColorExtractionPage> {
  List<int> _mainColor = [0, 0, 0]; // 主色调
  List<List<int>> _palette = []; // 调色板
  Image _image; // 图像对象

  @override
  void initState() {
    super.initState();

    // 示例 URL
    final url = 'https://github.githubassets.com/images/modules/open_graph/github-octocat.png';

    // 从 URL 获取主色调
    getColorFromUrl(url).then((color) {
      setState(() {
        _mainColor = color;
      });
    });

    // 从 URL 获取调色板
    getPaletteFromUrl(url).then((palette) {
      setState(() {
        _palette = palette;
      });
    });

    // 从 URL 获取图像
    getImageFromUrl(url).then((image) {
      setState(() {
        _image = image;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Color Thief Flutter Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            // 显示图像
            _image != null
                ? Image(image: _image)
                : CircularProgressIndicator(),

            SizedBox(height: 20),

            // 显示主色调
            Text(
              'Main Color: ${_mainColor.toString()}',
              style: TextStyle(fontSize: 18),
            ),

            SizedBox(height: 20),

            // 显示调色板
            Text(
              'Palette Colors:',
              style: TextStyle(fontSize: 18),
            ),
            Wrap(
              spacing: 10,
              runSpacing: 10,
              children: _palette.map((color) {
                return Container(
                  width: 50,
                  height: 50,
                  decoration: BoxDecoration(
                    color: Color.fromRGBO(color[0], color[1], color[2], 1),
                    borderRadius: BorderRadius.circular(8),
                  ),
                );
              }).toList(),
            ),
          ],
        ),
      ),
    );
  }
}

详细说明

函数详解

getColorFromUrl

从图像 URL 中提取主色调(最大聚类的颜色),返回格式为 [R, G, B]

getColorFromUrl(String url, [int quality])

参数:

  • url: 图像的 URL。
  • quality: 可选参数,默认值为 10,范围为 1 到 10。

getPaletteFromUrl

从图像 URL 中提取颜色调色板,返回格式为 [[R, G, B]]

getPaletteFromUrl(String url, [int colorCount, int quality])

参数:

  • url: 图像的 URL。
  • colorCount: 可选参数,表示调色板中的颜色数量,默认值为 10,范围为 2 到 256。
  • quality: 可选参数,默认值为 10,范围为 1 到 10。

getImageFromUrl

从图像 URL 获取图像对象。

getImageFromUrl(String url)

参数:

  • url: 图像的 URL。

getImageFromProvider

ImageProvider 获取图像对象。

getImageFromProvider(ImageProvider imageProvider)

参数:

  • imageProvider: 图像提供器。

getColorFromImage

从图像对象中提取主色调。

getColorFromImage(Image image, [int quality = 10])

参数:

  • image: 图像对象。
  • quality: 可选参数,默认值为 10,范围为 1 到 10。

getPaletteFromImage

从图像对象中提取颜色调色板。

getPaletteFromImage(Image image, [int colorCount, int quality])

参数:

  • image: 图像对象。
  • colorCount: 可选参数,表示调色板中的颜色数量,默认值为 10,范围为 2 到 256。
  • quality: 可选参数,默认值为 10,范围为 1 到 10。

工具函数

fromRGBtoHSV

将 RGB 颜色转换为 HSV 颜色。

fromRGBtoHSV(List<int> rgb)

参数:

  • rgb: RGB 颜色数组,范围为 [0, 255]

fromHSVtoRGB

将 HSV 颜色转换为 RGB 颜色。

fromHSVtoRGB(List<int> hsv)

更多关于Flutter颜色提取插件color_thief_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter颜色提取插件color_thief_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


color_thief_flutter 是一个用于从图像中提取主要颜色的 Flutter 插件。它基于 Color Thief 算法,可以帮助你从图像中提取出主要的颜色,以便在应用程序中使用。

安装

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

dependencies:
  flutter:
    sdk: flutter
  color_thief_flutter: ^0.0.1

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

使用

以下是一个简单的示例,展示如何使用 color_thief_flutter 从图像中提取主要颜色。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ColorThiefExample(),
    );
  }
}

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

class _ColorThiefExampleState extends State<ColorThiefExample> {
  Color? _dominantColor;
  List<Color>? _palette;

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

    if (pickedFile != null) {
      final imageFile = File(pickedFile.path);
      final dominantColor = await ColorThief.getColorFromFile(imageFile);
      final palette = await ColorThief.getPaletteFromFile(imageFile);

      setState(() {
        _dominantColor = dominantColor;
        _palette = palette;
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Color Thief Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            if (_dominantColor != null)
              Container(
                width: 100,
                height: 100,
                color: _dominantColor,
              ),
            if (_palette != null)
              Wrap(
                children: _palette!
                    .map((color) => Container(
                          width: 50,
                          height: 50,
                          color: color,
                        ))
                    .toList(),
              ),
            ElevatedButton(
              onPressed: _pickImageAndExtractColors,
              child: Text('Pick Image and Extract Colors'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部