Flutter图片模糊处理插件image_blur的使用

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

Flutter图片模糊处理插件 image_blur 的使用

image_blur 是一个用于在Flutter应用中为图片添加模糊效果的插件。该插件支持圆形和矩形形状的模糊效果,并且可以与本地和在线图片一起使用。

初始化缓存配置

在使用 image_blur 插件之前,需要先初始化缓存配置:

void main() async {
  await ImageBlur.init();
  runApp(const MyApp());
}

主要功能

以下是插件的主要功能示例:

矩形模糊预览

ImageBlur.imageHashPreview(
  imagePath: imageUrls[index],
  width: size.width,
  height: size.height,
);

简单模糊效果

ImageBlur(
  imageUrl: listimage[index],
);

圆形模糊预览

ImageBlur.imageHashPreviewCircular(
  size: 340,
  imagePath: "https://example.com/image.jpg",
)

圆形模糊效果

ImageBlur.imageCircularBlur(
  size: 340,
  imageNetwork: "https://example.com/image.jpg",
),

获取调色板颜色

ImageBlur.imageBlurGetPalletteColor(
  imageUrl: listimage[index],
)

开始使用

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

dependencies:
  image_blur: ^1.0.82

然后,在 Dart 文件中导入包:

import 'package:image_blur/image_blur.dart';

完整示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 image_blur 插件:

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

void main() async {
  await ImageBlur.init(removeCacheTime: 10);
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Demo App',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(
          seedColor: const Color.fromRGBO(55, 151, 239, 1),
          primary: const Color.fromRGBO(55, 151, 239, 1),
        ),
        useMaterial3: true,
      ),
      home: const Search(),
    );
  }
}

class Search extends StatelessWidget {
  const Search({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    Size size = MediaQuery.of(context).size;
    List<String> imageUrls = [
      "https://img.freepik.com/free-photo/pier-lake-hallstatt-austria_181624-44201.jpg",
      // 添加更多图片URL
    ];

    return SafeArea(
      child: Scaffold(
        body: SizedBox(
          width: size.width,
          height: size.height,
          child: Column(
            children: [
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  SizedBox(
                    width: size.width * 0.95,
                    child: SearchBar(
                      hintText: 'Search',
                      shape: MaterialStatePropertyAll(BeveledRectangleBorder(
                          borderRadius: BorderRadius.circular(5.0))),
                      hintStyle: const MaterialStatePropertyAll(
                          TextStyle(color: Colors.grey)),
                      elevation: MaterialStateProperty.all(1.0),
                      leading: const Padding(
                        padding: EdgeInsets.only(left: 10.0),
                        child: Icon(
                          Icons.search,
                          color: Colors.grey,
                        ),
                      ),
                    ),
                  ),
                ],
              ),
              Expanded(
                child: Padding(
                  padding: const EdgeInsets.symmetric(vertical: 5.0, horizontal: 5.0),
                  child: GridView.builder(
                    physics: const BouncingScrollPhysics(),
                    gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                      crossAxisSpacing: 5.0,
                      mainAxisSpacing: 5.0,
                      crossAxisCount: 3,
                    ),
                    itemBuilder: (context, index) {
                      return ClipRRect(
                        borderRadius: BorderRadius.circular(12.0),
                        child: Container(
                          decoration: BoxDecoration(
                            borderRadius: BorderRadius.circular(12.0),
                          ),
                          child: ImageBlur(
                            imageUrls: imageUrls[index],
                            width: size.width,
                            height: size.height,
                          ),
                        ),
                      );
                    },
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

额外信息

如果您有任何问题、疑问或建议,请随时通过邮件联系我们:swan.dev1993@gmail.com。我们欢迎您的反馈,并将尽力解决任何问题或提供帮助。

有关此插件的更多信息,您可以访问我们的 GitHub 仓库,在那里您可以找到额外的资源、参与插件的开发并提交问题或错误报告。感谢您的贡献和反馈,我们将努力使这个插件对用户尽可能有用。

感谢您使用我们的插件,期待您的反馈!


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

1 回复

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


当然,以下是如何在Flutter项目中使用image_blur插件来进行图片模糊处理的示例代码。

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

dependencies:
  flutter:
    sdk: flutter
  image_blur: ^0.4.0  # 请确保使用最新版本

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

接下来,你可以在Dart代码中使用这个插件。以下是一个简单的示例,展示如何加载一张图片并对其应用模糊效果:

import 'package:flutter/material.dart';
import 'package:image_blur/image_blur.dart';
import 'dart:ui' as ui;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Image Blur Example'),
        ),
        body: Center(
          child: ImageBlurDemo(),
        ),
      ),
    );
  }
}

class ImageBlurDemo extends StatefulWidget {
  @override
  _ImageBlurDemoState createState() => _ImageBlurDemoState();
}

class _ImageBlurDemoState extends State<ImageBlurDemo> {
  ui.Image? _image;
  ui.Image? _blurredImage;

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

  Future<void> _loadImage() async {
    final ByteData data = await rootBundle.load('assets/sample_image.jpg');
    final Uint8List bytes = data.buffer.asUint8List();
    _image = await decodeImageFromList(bytes);

    if (_image != null) {
      setState(() {
        _blurredImage = _applyBlurEffect(_image!);
      });
    }
  }

  ui.Image? _applyBlurEffect(ui.Image image) {
    final int width = image.width;
    final int height = image.height;
    final ByteData pixels = image.toByteData(format: ui.ImageByteFormat.rawRgba);
    final Uint8List rawPixels = pixels.buffer.asUint8List();

    final RenderRepaintBoundary boundary = RenderRepaintBoundary();
    final ui.Image blurredImage = await ImageBlur.blur(
      rawPixels,
      width,
      height,
      sigmaX: 10.0,
      sigmaY: 10.0,
    );

    return blurredImage;
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        if (_image != null)
          Image.memory(
            _image!.toByteData(format: ui.ImageByteFormat.png)!.buffer.asUint8List(),
            width: 300,
            height: 300,
            fit: BoxFit.cover,
            gaplessPlayback: true,
          ),
        if (_blurredImage != null)
          SizedBox(height: 20),
        if (_blurredImage != null)
          Image.memory(
            _blurredImage!.toByteData(format: ui.ImageByteFormat.png)!.buffer.asUint8List(),
            width: 300,
            height: 300,
            fit: BoxFit.cover,
            gaplessPlayback: true,
          ),
      ],
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. assets文件夹中加载了一张图片(请确保你已经将图片添加到assets文件夹,并在pubspec.yaml中正确配置)。
  2. 使用decodeImageFromList函数将图片数据解码为ui.Image对象。
  3. 使用ImageBlur.blur函数对图片应用模糊效果。
  4. 使用Image.memory将处理后的图片数据渲染到屏幕上。

请注意,ImageBlur.blur函数是异步的,因此我们在_loadImage函数中使用await等待其完成。另外,sigmaXsigmaY参数控制模糊的程度,你可以根据需要调整这些值。

确保你的图片资源路径和名称与代码中使用的相匹配。如果图片资源位于其他位置,请相应地调整代码。

回到顶部