Dart 语言 实现图像处理滤镜开发案例

Dart阿木 发布于 2025-06-20 5 次阅读


Dart 语言实现图像处理滤镜开发案例

随着移动设备和Web应用的普及,图像处理技术成为了许多应用不可或缺的一部分。Dart 语言作为一种现代化的编程语言,以其简洁、高效的特点在Web和移动应用开发中越来越受欢迎。本文将围绕Dart语言,介绍如何实现一个简单的图像处理滤镜开发案例,包括灰度化、模糊、锐化等常见滤镜效果。

环境准备

在开始之前,我们需要准备以下环境:

1. Dart SDK:从Dart官网下载并安装Dart SDK。

2. 编辑器:推荐使用Visual Studio Code,安装Dart插件。

3. Flutter SDK:如果要在移动设备上测试,需要安装Flutter SDK。

案例背景

本案例将实现一个简单的图像处理应用,用户可以选择不同的滤镜效果来处理图片。我们将使用Dart的`dart:io`库来读取本地图片文件,使用`dart:ui`库来绘制和处理图像。

实现步骤

1. 创建项目

创建一个新的Dart项目:

dart

dart create image_filter_app


cd image_filter_app


2. 引入必要的库

在`lib/main.dart`文件中,引入必要的库:

dart

import 'dart:io';


import 'dart:ui' as ui;


import 'package:flutter/material.dart';


import 'package:image_picker/image_picker.dart';


3. 创建主界面

创建一个简单的Flutter界面,用于展示图片和处理后的效果:

dart

class HomePage extends StatefulWidget {


@override


_HomePageState createState() => _HomePageState();


}

class _HomePageState extends State<HomePage> {


File? _image;


ui.Image? _processedImage;

Future<void> _pickImage() async {


final image = await ImagePicker().pickImage(source: ImageSource.gallery);


if (image == null) return;

setState(() {


_image = File(image.path);


});

final byteData = await image.readAsBytes();


final decodedImage = await ui.decodeImageFromList(byteData);


final imageProvider = ui.ImageMemory.fromBytes(decodedImage!.bytes)


..setPixelFormat(ui.PixelFormat.rgba8888)


..setBounds(ui.Rect.fromLTRB(0, 0, decodedImage.width, decodedImage.height));

final paint = ui.Paint()..color = const Color(0xFFFFFFFF);


final canvas = ui.Canvas(imageProvider);


canvas.drawRect(ui.Rect.fromLTRB(0, 0, decodedImage.width, decodedImage.height), paint);

final processedImage = await ui.Image.fromEncodedImage(


ui.EncodedImage.fromBuffer(decodedImage.width, decodedImage.height, decodedImage.bytes),


ui.PixelFormat.rgba8888,


);

setState(() {


_processedImage = processedImage;


});


}

@override


Widget build(BuildContext context) {


return Scaffold(


appBar: AppBar(


title: Text('Image Filter App'),


),


body: Center(


child: _image == null


? ElevatedButton(


onPressed: _pickImage,


child: Text('Pick an image'),


)


: _processedImage == null


? CircularProgressIndicator()


: Image.memory(_processedImage!.toByteData()!.buffer.asUint8List()),


),


);


}


}


4. 实现滤镜效果

接下来,我们将实现一些基本的滤镜效果,如灰度化、模糊和锐化。

灰度化

dart

ui.Image _applyGrayscale(ui.Image image) {


final width = image.width;


final height = image.height;


final buffer = image.getBytes();


final pixels = buffer.asUint8List();

for (int i = 0; i < pixels.length; i += 4) {


final r = pixels[i];


final g = pixels[i + 1];


final b = pixels[i + 2];


final gray = (r + g + b) ~/ 3;


pixels[i] = gray;


pixels[i + 1] = gray;


pixels[i + 2] = gray;


}

return ui.Image.fromBytes(width, height, pixels, pixelFormat: ui.PixelFormat.rgba8888);


}


模糊

dart

ui.Image _applyBlur(ui.Image image) {


final width = image.width;


final height = image.height;


final buffer = image.getBytes();


final pixels = buffer.asUint8List();

final kernel = [


1 / 16, 2 / 16, 1 / 16,


2 / 16, 4 / 16, 2 / 16,


1 / 16, 2 / 16, 1 / 16,


];

final blurredPixels = List.generate(pixels.length, (i) => 0);

for (int y = 0; y < height; y++) {


for (int x = 0; x < width; x++) {


final sum = [0, 0, 0, 0];


for (int ky = -1; ky <= 1; ky++) {


for (int kx = -1; kx <= 1; kx++) {


final iy = y + ky;


final ix = x + kx;


if (iy >= 0 && iy < height && ix >= 0 && ix < width) {


final offset = (iy width + ix) 4;


for (int c = 0; c < 4; c++) {


sum[c] += pixels[offset + c] kernel[(ky + 1) 3 + (kx + 1)];


}


}


}


}


final offset = (y width + x) 4;


blurredPixels[offset] = sum[0].round();


blurredPixels[offset + 1] = sum[1].round();


blurredPixels[offset + 2] = sum[2].round();


blurredPixels[offset + 3] = sum[3];


}


}

return ui.Image.fromBytes(width, height, blurredPixels, pixelFormat: ui.PixelFormat.rgba8888);


}


锐化

dart

ui.Image _applySharpen(ui.Image image) {


final width = image.width;


final height = image.height;


final buffer = image.getBytes();


final pixels = buffer.asUint8List();

final kernel = [


-1, -1, -1,


-1, 9, -1,


-1, -1, -1,


];

final sharpenedPixels = List.generate(pixels.length, (i) => 0);

for (int y = 1; y < height - 1; y++) {


for (int x = 1; x < width - 1; x++) {


final sum = [0, 0, 0, 0];


for (int ky = -1; ky <= 1; ky++) {


for (int kx = -1; kx <= 1; kx++) {


final iy = y + ky;


final ix = x + kx;


if (iy >= 0 && iy < height && ix >= 0 && ix < width) {


final offset = (iy width + ix) 4;


for (int c = 0; c < 4; c++) {


sum[c] += pixels[offset + c] kernel[(ky + 1) 3 + (kx + 1)];


}


}


}


}


final offset = (y width + x) 4;


sharpenedPixels[offset] = sum[0].round();


sharpenedPixels[offset + 1] = sum[1].round();


sharpenedPixels[offset + 2] = sum[2].round();


sharpenedPixels[offset + 3] = sum[3];


}


}

return ui.Image.fromBytes(width, height, sharpenedPixels, pixelFormat: ui.PixelFormat.rgba8888);


}


5. 添加滤镜按钮

在`HomePage`类中,添加按钮来触发不同的滤镜效果:

dart

ElevatedButton(


onPressed: () {


setState(() {


_processedImage = _applyGrayscale(_processedImage!);


});


},


child: Text('Grayscale'),


),


ElevatedButton(


onPressed: () {


setState(() {


_processedImage = _applyBlur(_processedImage!);


});


},


child: Text('Blur'),


),


ElevatedButton(


onPressed: () {


setState(() {


_processedImage = _applySharpen(_processedImage!);


});


},


child: Text('Sharpen'),


),


总结

本文介绍了如何使用Dart语言实现一个简单的图像处理滤镜开发案例。通过引入必要的库,创建主界面,实现滤镜效果,并添加滤镜按钮,我们成功实现了一个可以处理图片并应用不同滤镜效果的Flutter应用。这个案例可以作为进一步学习和开发更复杂图像处理应用的起点。