Flutter图片水印插件stamp_image的使用

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

Flutter图片水印插件stamp_image的使用

stamp_image 是一个用于在图片上添加水印的Flutter库。你可以使用任何小部件来自定义水印的位置,并且可以在一张图片上设置多个水印。

示例用例

  1. 为从相机或图库获取的图片设置地址名称
  2. 为产品图片设置公司标志
  3. 为图片设置温度信息

完整示例Demo

以下是一个完整的示例代码,展示了如何使用 stamp_image 插件来为图片添加水印:

import 'dart:io';
import 'dart:ui';

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:stamp_image/stamp_image.dart';

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

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

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final picker = ImagePicker();
  File? image;

  void takePicture() async {
    // 从图库中选择图片
    final pickedFile = await picker.getImage(source: ImageSource.gallery);
    if (pickedFile != null) {
      await resetImage();

      // 创建水印图片
      StampImage.create(
        context: context,
        image: File(pickedFile.path),
        children: [
          Positioned(
            bottom: 0,
            right: 0,
            child: _watermarkItem(),
          ),
          Positioned(
            top: 0,
            left: 0,
            child: _logoFlutter(),
          )
        ],
        onSuccess: (file) => resultStamp(file),
      );
    }
  }

  /// 重置图片文件
  Future resetImage() async {
    setState(() {
      image = null;
    });
  }

  /// 处理水印图片生成完成后的回调
  void resultStamp(File? file) {
    print(file?.path);
    setState(() {
      image = file;
    });
  }

  /// 创建时间戳水印
  Widget _watermarkItem() {
    return Padding(
      padding: const EdgeInsets.all(10),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.end,
        children: [
          Text(
            DateTime.now().toString(),
            style: TextStyle(color: Colors.white, fontSize: 15),
          ),
          SizedBox(height: 5),
          Text(
            "Made By Stamp Image",
            maxLines: 2,
            overflow: TextOverflow.ellipsis,
            style: TextStyle(
              color: Colors.blue,
              fontWeight: FontWeight.bold,
              fontSize: 15,
            ),
          ),
        ],
      ),
    );
  }

  /// 创建Flutter标志水印
  Widget _logoFlutter() {
    return Container(
      margin: EdgeInsets.all(10),
      decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.white),
      child: Padding(
        padding: const EdgeInsets.all(8),
        child: FlutterLogo(),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Stamp Imager"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            _imageWidget(),
            SizedBox(height: 10),
            _buttonTakePicture()
          ],
        ),
      ),
    );
  }

  /// 创建“选择图片”按钮
  Widget _buttonTakePicture() {
    return Container(
      margin: EdgeInsets.symmetric(horizontal: 20),
      width: MediaQuery.of(context).size.width,
      child: ElevatedButton(
        onPressed: () => takePicture(),
        style: ElevatedButton.styleFrom(
          primary: Colors.blue,
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(5),
          ),
        ),
        child: Text(
          "选择图片",
          style: TextStyle(color: Colors.white, fontSize: 20),
        ),
      ),
    );
  }

  /// 显示图片
  Widget _imageWidget() {
    return Container(
      width: MediaQuery.of(context).size.width / 1.1,
      child: image != null ? Image.file(image!) : SizedBox(),
    );
  }
}

保存到指定位置

如果你希望将生成的带有水印的图片自动保存到特定位置,可以使用 path_provider 插件来获取保存路径。以下是修改后的代码示例:

import 'dart:io';
import 'dart:ui';

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:path_provider/path_provider.dart';
import 'package:stamp_image/stamp_image.dart';

void generate() async {
  Directory? directory = await getDownloadsDirectory(); // 获取下载目录
  StampImage.create(
    context: context, 
    image: imageFile,
    savePath: directory?.path, // 设置保存路径
    saveFile: true, // 启用保存功能
    children: [
      Positioned(
        bottom: 0,
        right: 0,
        child: _watermarkItem(),
      ),
    ],
    onSuccess: (file) => resultStamp(file),
  );
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用stamp_image插件来为图片添加水印的示例代码。

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

dependencies:
  flutter:
    sdk: flutter
  stamp_image: ^最新版本号  # 请替换为最新的版本号

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

接下来,你可以在你的Dart文件中使用StampImage来为图片添加水印。以下是一个完整的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Stamp Image Example'),
        ),
        body: Center(
          child: FutureBuilder<Uint8List>(
            future: _loadImage(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                if (snapshot.hasError) {
                  return Text('Error loading image');
                } else {
                  return StampImage(
                    image: MemoryImage(snapshot.data!),
                    stamp: TextStamp(
                      text: 'Watermark',
                      color: Colors.red,
                      fontSize: 24,
                      alignment: Alignment.bottomRight,
                      margin: EdgeInsets.all(10),
                    ),
                  );
                }
              } else {
                return CircularProgressIndicator();
              }
            },
          ),
        ),
      ),
    );
  }

  Future<Uint8List> _loadImage() async {
    // 这里加载一个本地图片,你可以替换为网络图片或其他图片来源
    final ByteData bytes = await rootBundle.load('assets/your_image.png');
    return bytes.buffer.asUint8List();
  }
}

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

  1. pubspec.yaml文件中添加了stamp_image依赖。
  2. 使用FutureBuilder来异步加载一张图片(这里假设图片在assets文件夹中,你需要确保图片已被正确添加到assets并在pubspec.yaml中声明)。
  3. 使用StampImage小部件将水印添加到加载的图片上。水印使用的是TextStamp,它允许你指定水印文本、颜色、字体大小、对齐方式和边距。

请确保你的项目中有一个名为assets的文件夹,并且图片文件(例如your_image.png)已经被添加到该文件夹中,同时在pubspec.yamlflutter部分下的assets字段中声明它:

flutter:
  assets:
    - assets/your_image.png

这样,你就可以在Flutter应用中成功地为图片添加水印了。

回到顶部