Flutter图片比较插件image_compare_2的使用
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()
实现步骤
-
初始化两个图像源,可以是以下任意组合:
- Uri: 图像URL
- File: 图像文件
- List: 表示图像的字节数组
- Image: 图像类
-
选择一种算法(从类别部分选择)。
-
比较图像:
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
更多关于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.jpg
和after.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
插件来比较两张图片。你可以根据需要进一步自定义和扩展此功能。