You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter实现相机添加文字水印并保存带水印照片至相册方法求教

Flutter相机添加水印并保存至相册实现方案

一、依赖准备

在pubspec.yaml中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  camera: ^0.10.5+5  # 相机功能
  image: ^4.0.17      # 图片处理
  image_gallery_saver: ^2.0.3  # 保存到相册
  path_provider: ^2.1.1       # 获取本地路径

执行flutter pub get完成依赖安装。

二、相机预览层显示水印(视觉预览)

用Stack组件将水印叠加在相机预览上方,拍照前就能直观看到水印效果:

Stack(
  children: [
    CameraPreview(_controller), // 相机预览组件
    Positioned(
      bottom: 20,
      right: 20,
      child: Text(
        "自定义水印",
        style: TextStyle(
          color: Colors.white,
          fontSize: 18,
          shadows: const [Shadow(color: Colors.black, blurRadius: 2)],
        ),
      ),
    ),
  ],
)

可根据需求调整水印位置、样式,比如换成带背景的Container或图片水印。

三、拍照后给图片添加真实水印

UI层的水印不会被写入照片,需用image包处理拍摄后的图片,添加永久水印:

// 拍照获取原始图片
XFile rawPicture = await _controller.takePicture();
File imageFile = File(rawPicture.path);
Uint8List rawBytes = await imageFile.readAsBytes();

// 解码图片为可编辑对象
Image editableImage = decodeImage(rawBytes)!;

// 创建画布并设置画笔
Canvas canvas = Canvas(editableImage);
Paint textPaint = Paint()
  ..color = Colors.white
  ..style = PaintingStyle.fill;

// 绘制文字水印(使用内置字体,若需自定义字体可加载本地字体文件)
drawString(
  canvas,
  arial_48, // 内置字体,替换为自定义字体需提前加载
  "自定义水印",
  editableImage.width - 160, // 水印右侧偏移量
  editableImage.height - 90, // 水印底部偏移量
  textPaint,
);

// 编码处理后的图片
Uint8List watermarkedBytes = encodeJpg(editableImage);

四、保存带水印的图片到相册

用image_gallery_saver将处理后的图片存入系统相册:

final saveResult = await ImageGallerySaver.saveImage(
  watermarkedBytes,
  quality: 90,
  name: "watermarked_${DateTime.now().millisecondsSinceEpoch}",
);

if (saveResult['isSuccess']) {
  ScaffoldMessenger.of(context).showSnackBar(
    const SnackBar(content: Text("照片已保存至相册")),
  );
} else {
  ScaffoldMessenger.of(context).showSnackBar(
    const SnackBar(content: Text("保存失败,请重试")),
  );
}

五、权限配置

  • Android:在android/app/src/main/AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" android:minSdkVersion="33" />
  • iOS:在ios/Runner/Info.plist中添加权限说明:
<key>NSCameraUsageDescription</key>
<string>需要使用相机拍摄照片</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>需要将照片保存到相册</string>

内容的提问来源于stack exchange,提问作者Raj Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:12:55