stack_blur
将 堆栈模糊 应用于
具有 RGBA 像素的缓冲区。
堆栈模糊算法运行速度快且效果好。它是
高斯模糊
和 盒式模糊 之间的折衷。
与 image 库一起使用
import 'dart:io';
import 'package:image/image.dart';
import 'package:stack_blur/stack_blur.dart';
void main() {
// loading image from file
final image = decodeImage(File('source.png').readAsBytesSync())!;
// blurring image pixels with blur radius 42
stackBlurRgba(image.data, image.width, image.height, 42);
// saving image to file
File('blurred.png').writeAsBytesSync(encodePng(image));
}
与 Flutter 和 bitmap 库一起使用
Flutter 图像具有相同的 RGBA 像素缓冲区。您可以通过 ImageStreamListener 以一种相当不明显的方式获取它。
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:bitmap/bitmap.dart';
Future<Image> blurAsset(String assetName) async {
ImageProvider provider = ExactAssetImage(assetName);
// Rain dance to get RGBA pixels from image
final ImageStream stream = provider.resolve(ImageConfiguration.empty);
final completer = Completer<ui.Image>();
late ImageStreamListener listener;
listener = ImageStreamListener((frame, _) {
stream.removeListener(listener);
completer.complete(frame.image);
});
stream.addListener(listener);
ui.Image image = await completer.future;
ByteData rgbaData = (await image.toByteData(format: ui.ImageByteFormat.rawRgba))!;
// This is the pixels we need
Uint32List rgbaPixels = rgbaData.buffer.asUint32List();
// We can blur the image buffer
stackBlurRgba(rgbaPixels, image.width, image.height, 42);
// We need a third-party 'bitmap' library to turn the buffer into a widget
final bitmap = Bitmap.fromHeadless(
image.width, image.height,
rgbaData.buffer.asUint8List());
return Image.memory(bitmap.buildHeaded());
}