周末不想在家 2024-03-29 16:54 采纳率: 8%
浏览 20

Flutter 如何给图片加文字水印,需要支持各种图片格式

Flutter 如何给图片加文字水印,需要支持png、gif、webp 等图片格式

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-29 16:54
    关注

    引自免费微信小程序:皆我百晓生

    在 Flutter 中,要为图片添加文字水印,可以遵循以下步骤:

    1. 首先,确保你已安装了 flutter_image_watermarkimage_picker 模块。这两个模块是用于处理图像处理操作的库。

      dependencies [
        'package:flutter_image_watermark',
        'package:image_picker',
      ];
      
    2. 在你的 Flutter 文件(例如,main.dart)中导入并初始化 ImageWatermarkImagePicker 类:

      import 'package:flutter/material.dart';
      import 'package:image_picker/image_picker.dart';
      
      class MyWidget extends StatefulWidget {
        @override
        _MyWidgetState createState() => _MyWidgetState();
      }
      
      class _MyWidgetState extends State<MyWidget> {
        Image watermarkImage = AssetImage('assets/watermark.png');
        Image watermarkIcon = AssetImage('assets/watermark_icon.png');
      
        void onImagePicked(_Image picked) async {
          File imageFile = await picked.path;
          String imagePath = '${imageFile.path}';
          try {
            Image watermarkedImage = Image.fromBytes(await ImagePicker.getImage(source: ImageSource.gallery));
            if (watermarkedImage != null) {
              setState(() {
                watermarkImage = watermarkedImage;
              });
            }
          } catch (e) {
            print(e);
          }
        }
      
        @override
        Widget build(BuildContext context) {
          return Scaffold(
            appBar: AppBar(
              title: Text('Watermark Image'),
            ),
            body: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Image.asset(watermarkImage),
                  SizedBox(height: 30),
                  ElevatedButton(
                    onPressed: () {
                      Image watermarkedImage = Image.asset(watermarkIcon);
                      if (watermarkedImage != null) {
                        // Watermark your text here using the `onImagePicked` method.
                        const imageDescription = 'Some text';
                        // Replace this with the code to insert the text into the watermark image:
                        final watermarkDescription = watermarkDescription.replace('Text', imageDescription);
      
                        Image watermarkWithDescription = Image watermarkedImage.resize((int) watermarkDescription.length, BoxFit.cover);
                        if (watermarkWithDescription != null) {
                          setState(() {
                            watermarkWithDescription = watermarkWithDescription;
                          });
                        }
                      }
                    },
                    child: Text('Add Watermark'),
                  ),
                ],
              ),
            ),
          );
        }
      }
      

    在这个例子中,我们首先创建了一个名为 imageWatermarkImage 对象,并将其设置为图片文件的路径。然后,我们在 onImagePicked 方法中获取图片的路径,并通过 fromBytes 方法从 ImagePicker 获取图片内容。如果图片内容不是空指针,我们则将图片转换为水印图片,并且修改水印中的文本(在这里使用了 String replacement 函数,将 'Text' 替换为当前的图像描述)。接下来,我们将修改后的水印图像保存到一个新变量 watermarkWithDescription 中,并将其替换回原始的 imageWatermark 对象,从而实现了文字水印的功能。

    请注意,这只是一个基本示例,实际应用时可能需要根据你的具体需求进行修改和扩展,例如:

    • 文字的样式(例如字体大小、颜色、对齐方式等):在 ImageWatermark 的构造函数中添加相应的属性。
    • 添加删除水印的逻辑:可以在 onImagePicked 方法中添加删除水印的操作,如在图片内容不存在或已经被其他元素覆盖的情况下自动删除水印。
    • 布局调整:调整图片、文字和水印之间的位置关系,使其更符合预期的布局要求。

    再次强调,如果你需要在 Flutter 中绘制图形或其他功能,应使用绘制工具和API,而不仅仅是简单地调用 Image 类的方法。例如,如果你想要绘制一个圆角矩形,可以使用 PathLinearPath 线条类型:

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(title: Text('My App')),
            body: Center(
              child: CircleAvatar(
                radius: 50.0,
                backgroundImage: AssetImage('assets/avatar.png'),
                backgroundColor: Colors.white,
              ),
              child: Text('A Real Avatar'),
            ),
          ),
        );
      }
    }
    

    在这个例子中,我们使用了 CircleAvatar 组件和 AssetImage 图像资源来绘制一个圆形头像,并在其上显示了一段文本 "A Real Avatar"。在 Text 的布局中,我们设置了合适的圆角大小,使用了 backgroundColor 属性设置背景色为白色。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月29日

悬赏问题

  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用