Flutter图片水印插件watermark_unique的使用

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

Flutter图片水印插件watermark_unique的使用

watermark_unique 是一个用于在图片上添加文本和图像水印的Flutter插件。你可以自定义水印的位置、颜色、背景颜色和填充等属性。

插件功能

  • 向图片中添加文本
  • 向图片中添加水印
  • 通过File或Uint8List获取结果

可修改的参数

  • 文本内容
  • X轴位置
  • Y轴位置
  • 文字大小
  • 文字颜色(带有透明度)
  • 背景文字颜色(可选/带有透明度)
  • 如果存在背景,则为文本设置内边距(可选)
  • 图片质量
  • 图像格式(用于压缩)

使用方法

添加文本水印示例(仅适用于iOS或Android)

import 'package:watermark_unique/watermark_unique.dart';

final image = await watermarkPlugin.addTextWatermark(
  filePath: photo!.path, // 图片文件路径
  text: 'Test watermark text', // 水印文本
  x: 500, // X轴位置
  y: 400, // Y轴位置
  textSize: 250, // 文字大小
  color: Colors.purpleAccent, // 文字颜色
  isNeedRotateToPortrait: true, // 将图片旋转为纵向(默认:false)仅限Android
  backgroundTextColor: Colors.black.withOpacity(0.5), // 背景文字颜色(可选)
  quality: 100, // 带有水印的图片质量
  backgroundTextPaddingLeft: 12, // 背景文本左边距(可选)
  backgroundTextPaddingTop: 12, // 背景文本顶边距(可选)
  backgroundTextPaddingRight: 12, // 背景文本右边距(可选)
  backgroundTextPaddingBottom: 12, // 背景文本底边距(可选)
  imageFormat: ImageFormat.jpeg, // 用于压缩的图像格式
);

添加图像水印示例(仅适用于iOS或Android)

final image = await watermarkPlugin.addImageWatermark(
  filePath: photo!.path, // 图片文件路径
  watermarkImagePath: watermark!.path, // 水印图片文件路径
  x: 500, // X轴位置
  y: 400, // Y轴位置
  quality: 100, // 带有水印的图片质量
  imageFormat: ImageFormat.jpeg, // 用于压缩的图像格式
  watermarkWidth: 300, // 水印图片宽度
  watermarkHeight: 300,  // 水印图片高度
);

添加文本水印并以Uint8List形式获取结果(支持iOS、Android和Web)

final image = await watermarkPlugin.addTextWatermarkUint8List(
  filePath: photo!.path, // 图片文件路径
  text: 'Test watermark text', // 水印文本
  x: 500, // X轴位置
  y: 400, // Y轴位置
  textSize: 250, // 文字大小
  color: Colors.purpleAccent, // 文字颜色
  isNeedRotateToPortrait: true, // 将图片旋转为纵向(默认:false)仅限Android
  backgroundTextColor: Colors.black, // 背景文字颜色(可选)
  backgroundTextPaddingLeft: 12, // 背景文本左边距(可选)
  backgroundTextPaddingTop: 12, // 背景文本顶边距(可选)
  backgroundTextPaddingRight: 12, // 背景文本右边距(可选)
  backgroundTextPaddingBottom: 12, // 背景文本底边距(可选)
);

添加图像水印并以Uint8List形式获取结果(支持iOS、Android和Web)

final image = await watermarkPlugin.addImageWatermarkUint8List(
  filePath: photo!.path, // 图片文件路径
  watermarkImagePath: watermark!.path, // 水印图片文件路径
  x: 500, // X轴位置
  y: 400, // Y轴位置
  watermarkWidth: 300, // 水印图片宽度
  watermarkHeight: 300,  // 水印图片高度
);

示例截图

Android Example Android Example Image Watermark Android Example Text

完整的示例Demo

下面是一个完整的Flutter应用示例,展示了如何使用watermark_unique插件:

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

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

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

class WatermarkExample extends StatefulWidget {
  const WatermarkExample({Key? key}) : super(key: key);

  @override
  _WatermarkExampleState createState() => _WatermarkExampleState();
}

class _WatermarkExampleState extends State<WatermarkExample> {
  final ImagePicker _picker = ImagePicker();
  XFile? _image;
  XFile? _watermark;

  Future<void> _pickImage() async {
    final pickedFile = await _picker.pickImage(source: ImageSource.gallery);
    if (pickedFile != null) {
      setState(() {
        _image = pickedFile;
      });
    }
  }

  Future<void> _pickWatermark() async {
    final pickedFile = await _picker.pickImage(source: ImageSource.gallery);
    if (pickedFile != null) {
      setState(() {
        _watermark = pickedFile;
      });
    }
  }

  Future<void> _addTextWatermark() async {
    if (_image == null) return;

    final result = await watermarkPlugin.addTextWatermark(
      filePath: _image!.path,
      text: 'Hello Watermark',
      x: 100,
      y: 100,
      textSize: 50,
      color: Colors.red,
      quality: 100,
      imageFormat: ImageFormat.jpeg,
    );

    // Handle the result as needed.
  }

  Future<void> _addImageWatermark() async {
    if (_image == null || _watermark == null) return;

    final result = await watermarkPlugin.addImageWatermark(
      filePath: _image!.path,
      watermarkImagePath: _watermark!.path,
      x: 100,
      y: 100,
      quality: 100,
      imageFormat: ImageFormat.jpeg,
      watermarkWidth: 100,
      watermarkHeight: 100,
    );

    // Handle the result as needed.
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Column(
        children: [
          ElevatedButton(
            onPressed: _pickImage,
            child: Text('Pick an Image'),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: _pickWatermark,
            child: Text('Pick a Watermark Image'),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: _addTextWatermark,
            child: Text('Add Text Watermark'),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: _addImageWatermark,
            child: Text('Add Image Watermark'),
          ),
          if (_image != null) ...[
            SizedBox(height: 20),
            Image.file(File(_image!.path)),
          ],
        ],
      ),
    );
  }
}

以上代码展示了如何从相册中选择图片,并添加文本和图像水印的基本用法。根据需要调整参数可以实现不同的效果。


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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用watermark_unique插件来给图片添加水印的示例代码。这个插件允许你在图片上添加文字或图像水印。

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

dependencies:
  flutter:
    sdk: flutter
  watermark_unique: ^x.y.z  # 请将x.y.z替换为当前最新版本号

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

接下来,你可以在你的Dart文件中使用以下代码来给图片添加水印:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: WatermarkExample(),
    );
  }
}

class WatermarkExample extends StatefulWidget {
  @override
  _WatermarkExampleState createState() => _WatermarkExampleState();
}

class _WatermarkExampleState extends State<WatermarkExample> {
  Uint8List? watermarkedImage;

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

  Future<void> _addWatermark() async {
    // 加载原始图片
    final ByteData imageData = await rootBundle.load('assets/your_image.png');
    final Uint8List imageBytes = imageData.buffer.asUint8List();
    final ui.Codec codec = await ui.instantiateImageCodec(imageBytes);
    final ui.FrameInfo frameInfo = await codec.getNextFrame();
    final ui.Image image = frameInfo.image;

    // 创建水印配置
    final WatermarkConfig config = WatermarkConfig(
      text: 'Sample Watermark',
      textStyle: TextStyle(
        color: Colors.white,
        fontSize: 24,
        fontWeight: FontWeight.bold,
      ),
      position: WatermarkPosition.bottomRight,
      margin: EdgeInsets.all(10),
      backgroundColor: Colors.black.withOpacity(0.5),
      padding: EdgeInsets.all(5),
      borderRadius: 10,
    );

    // 添加水印
    final WatermarkUnique watermarkUnique = WatermarkUnique();
    final Uint8List watermarkedImageBytes = await watermarkUnique.addWatermark(
      image: image,
      config: config,
    );

    // 更新状态
    setState(() {
      watermarkedImage = watermarkedImageBytes;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Watermark Example'),
      ),
      body: Center(
        child: watermarkedImage != null
            ? Image.memory(watermarkedImage!)
            : CircularProgressIndicator(),
      ),
    );
  }
}

请注意以下几点:

  1. 确保在assets文件夹中有一个名为your_image.png的图片文件,并在pubspec.yaml中声明它:

    flutter:
      assets:
        - assets/your_image.png
    
  2. WatermarkConfig类提供了多种配置选项,你可以根据需要调整水印的文本、样式、位置、边距、背景颜色和填充等。

  3. 在实际项目中,你可能需要在Image.memory组件上添加错误处理,以防水印添加失败或其他图像加载问题。

  4. watermark_unique插件可能会随着版本更新而有所变化,因此请参考最新的文档和示例代码以获取最佳实践。

这个示例展示了如何使用watermark_unique插件在Flutter应用中给图片添加文本水印。如果你需要添加图像水印,可以查阅插件的文档以了解更多高级用法。

回到顶部