Flutter图片比较插件image_compare_2的使用

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

Flutter图片比较插件 image_compare_2 的使用

简介

image_compare_2 是一个用于比较图像差异的Dart包。它提供了多种算法来比较图像,包括像素匹配、欧几里得颜色距离、直方图比较和哈希比较等。

为什么选择 image_compare_2

原始的 image_compare 包在某些情况下会破坏一些依赖项,并且更新不及时。因此,image_compare_2 对其进行了更新和改进。如果 image_compare 后续更新并超越了 image_compare_2,建议优先使用 image_compare

新特性

  • 处理透明度:通过设置 ignoreAlpha 参数为 true 来忽略 alpha 通道。
  • 支持 EuclideanColorDistance、PixelMatching 和直方图算法。

依赖

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

dependencies:
  image_compare_2: ^1.1.3

然后导入包:

import 'package:image_compare_2/image_compare_2.dart';

类别

像素比较算法

  • Pixel Matching: PixelMatching({bool ignoreAlpha = true, double tolerance = 0.05})
  • Euclidean Color Distance: EuclideanColorDistance({bool ignoreAlpha = true})
  • IMage Euclidean Distance: IMED({double sigma = 1, double blurRatio = 0.005})

直方图比较算法

  • Chi Square Distance: ChiSquareDistanceHistogram({bool ignoreAlpha = true})
  • Intersection: IntersectionHistogram({bool ignoreAlpha = true})

哈希比较算法

  • Perceptual Hash: PerceptualHash()
  • Average Hash: AverageHash()
  • Median Hash: MedianHash()

实现步骤

  1. 初始化两个图像源,可以是以下任意组合:

    • Uri: 图像URL
    • File: 图像文件
    • List: 表示图像的字节数组
    • Image: 图像类
  2. 选择一种算法(从类别部分选择)。

  3. 比较图像:

var result = await compareImages(src1: a, src2: b, algorithm: ChiSquareDistanceHistogram());

// 或者将一个图像源与多个其他图像进行比较
var results = await listCompare(target: a, list: [a, b], algorithm: IMED(blurRatio: 0.1));

示例代码

下面是一个完整的示例代码,展示了如何使用 image_compare_2 包来比较不同类型的图像源:

import 'dart:io';
import 'package:image/image.dart';
import 'package:image_compare_2/image_compare_2.dart';

void main(List<String> arguments) async {
  // URL 示例
  var url1 = 'https://www.tompetty.com/sites/g/files/g2000014681/files/2022-06/TP%20skateboard%205.14.jpg';
  var url2 = 'https://fujifilm-x.com/wp-content/uploads/2019/08/x-t30_sample-images03.jpg';

  // 文件示例
  var file1 = File('images/drawings/kolam1.png');
  var file2 = File('images/drawings/scribble1.png');

  // 字节示例
  var bytes1 = File('images/animals/koala.jpg').readAsBytesSync();
  var bytes2 = File('images/animals/komodo.jpg').readAsBytesSync();

  // Image 类示例
  var image1 = decodeImage(bytes1);
  var image2 = decodeImage(bytes2);

  // 资产图像列表
  var assetImages = [
    File('images/animals/bunny.jpg'),
    File('images/objects/red_apple.png'),
    File('images/animals/tiger.jpg')
  ];

  // 网络图像列表
  var networkImages = [
    Uri.parse('https://fujifilm-x.com/wp-content/uploads/2019/08/x-t30_sample-images03.jpg'),
    Uri.parse('https://hs.sbcounty.gov/cn/Photo%20Gallery/Sample%20Picture%20-%20Koala.jpg'),
    Uri.parse('https://c.files.bbci.co.uk/12A9B/production/_111434467_gettyimages-1143489763.jpg'),
  ];

  // 计算两个网络图像之间的卡方直方图距离
  var networkResult = await compareImages(
      src1: Uri.parse(url1),
      src2: Uri.parse(url2),
      algorithm: ChiSquareDistanceHistogram());

  print('Difference: ${networkResult * 100}%');

  // 计算两个资产图像之间的 IMED 距离
  var assetResult = await compareImages(
      src1: image1, src2: image2, algorithm: IMED(blurRatio: 0.001));

  print('Difference: ${assetResult * 100}%');

  // 计算两个字节图像之间的交集直方图差异
  var byteResult = await compareImages(
      src1: bytes1, src2: bytes2, algorithm: IntersectionHistogram());

  print('Difference: ${byteResult * 100}%');

  // 计算两个图像之间的欧几里得颜色距离
  var imageResult = await compareImages(
      src1: file1,
      src2: file2,
      algorithm: EuclideanColorDistance(ignoreAlpha: true));

  print('Difference: ${imageResult * 100}%');

  // 计算一个网络图像和一个资产图像之间的像素匹配差异
  var networkAssetResult = await compareImages(
      src1: Uri.parse(url2),
      src2: image2,
      algorithm: PixelMatching(tolerance: 0.1));

  print('Difference: ${networkAssetResult * 100}%');

  // 计算一个字节数组和图像之间的中值哈希差异
  var byteImageResult =
      await compareImages(src1: image1, src2: bytes2, algorithm: MedianHash());

  print('Difference: ${byteImageResult * 100}%');

  // 计算一个网络图像和多个网络图像之间的平均哈希差异
  var networkResults = await listCompare(
    target: Uri.parse(url1),
    list: networkImages,
    algorithm: AverageHash(),
  );

  networkResults.forEach((e) => print('Difference: ${e * 100}%'));

  // 计算一个资产图像和多个资产图像之间的感知哈希差异
  var assetResults = await listCompare(
    target: File('../images/animals/deer.jpg'),
    list: assetImages,
    algorithm: PerceptualHash(),
  );

  assetResults.forEach((e) => print('Difference: ${e * 100}%'));
}

这个示例展示了如何使用 image_compare_2 包来比较不同类型的图像源,并输出它们之间的差异百分比。你可以根据需要选择不同的算法来进行图像比较。


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

1 回复

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


当然,以下是如何在Flutter项目中使用image_compare_2插件的详细步骤和代码示例。image_compare_2是一个用于图片比较的Flutter插件,它允许用户在两张图片之间滑动以查看差异。

第一步:添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  image_compare_2: ^latest_version  # 请替换为最新版本号

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

第二步:导入插件

在你需要使用图片比较的Dart文件中导入插件:

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

第三步:使用插件

下面是一个完整的示例,展示如何在Flutter应用中使用image_compare_2插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Image Compare Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ImageCompareScreen(),
    );
  }
}

class ImageCompareScreen extends StatefulWidget {
  @override
  _ImageCompareScreenState createState() => _ImageCompareScreenState();
}

class _ImageCompareScreenState extends State<ImageCompareScreen> {
  final String beforeImagePath = 'assets/before.jpg';  // 替换为你的图片路径
  final String afterImagePath = 'assets/after.jpg';    // 替换为你的图片路径

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Compare Example'),
      ),
      body: Center(
        child: ImageCompare(
          beforeImage: beforeImagePath,
          afterImage: afterImagePath,
          onCompareChanged: (percent) {
            print('Comparison percentage: $percent');
          },
        ),
      ),
    );
  }
}

第四步:添加图片资源

确保你已经在assets文件夹中添加了before.jpgafter.jpg图片,并在pubspec.yaml中声明了这些资源:

flutter:
  assets:
    - assets/before.jpg
    - assets/after.jpg

完整项目结构

你的项目结构应该像这样:

your_flutter_project/
├── android/
├── ios/
├── assets/
│   ├── before.jpg
│   ├── after.jpg
├── lib/
│   ├── main.dart
├── pubspec.yaml
└── ...

运行应用

最后,通过运行flutter run来启动你的Flutter应用,你应该能看到一个包含图片比较功能的界面。

这个示例展示了如何使用image_compare_2插件来比较两张图片。你可以根据需要进一步自定义和扩展此功能。

回到顶部