Flutter实现水印打卡照片

公司要求拍照以后返回加一层水印在照片上,网上找了几个组件本来都实现了结果发现只有英文不给写中文气得要死

整体来说就是这个方法,思路就是把照片当做画布然后再画一个水印出来设置透明背景把两张图拼在一起 copyImageToDocumentDirectory方法是为了解决ios图片地址的问题 有兴趣的小伙伴可以参考一下

复制代码
  Future<String> createAndSaveImageWithMerge(String imagePath) async {
    final image = await loadImage(imagePath);
    final imageWidth = image.width;
    final imageHeight = image.height;

    final recorder = ui.PictureRecorder();
    final canvas = Canvas(
        recorder,
        Rect.fromPoints(Offset(0, 0),
            Offset(imageWidth.toDouble(), imageHeight.toDouble())));

    final paint = Paint();
    canvas.drawImage(image, Offset.zero, paint);

    final textSpan = TextSpan(
      text:
          '${widget.watermarkModel?.siteName ?? "--"}\n${widget.watermarkModel?.watermarkTime}\n${widget.watermarkModel?.addressName}\n',
      style: const TextStyle(color: Colors.white, fontSize: 50),
    );
    final textPainter = TextPainter(
      text: textSpan,
      textAlign: TextAlign.left,
      textDirection: TextDirection.ltr,
    );
    textPainter.layout(minWidth: 0, maxWidth: imageWidth.toDouble());
    final offset = Offset(10, imageHeight.toDouble() - textPainter.height - 10);
    textPainter.paint(canvas, offset);
    LoadingUtil.hideLoading();
    final picture = recorder.endRecording();
    final img = await picture.toImage(imageWidth, imageHeight);
    final byteData = await img.toByteData(format: ui.ImageByteFormat.png);
    final pngBytes = byteData!.buffer.asUint8List();

    final mergedImage = imgs.decodeImage(pngBytes)!;
    final jpgBytes = imgs.encodeJpg(mergedImage);
    final path = imagePath;
    final file = File(path);
    LoadingUtil.showLoading("加载中",EasyLoadingIndicatorType.fadingCircle);

    await file.writeAsBytes(jpgBytes);

    // 使用 copyImageToDocumentDirectory 方法将图片保存到本地并获取新路径
    List<String> newPaths = await copyImageToDocumentDirectory([path]);
    return newPaths.first; // 返回保存后的新路径
  }

  Future<List<String>> copyImageToDocumentDirectory(
      List<String> oldPathList) async {
    if (Platform.isAndroid) return oldPathList;
    List<String> newListPath = [];
    await Future.forEach<String>(oldPathList, (oldPath) async {
      final oldImageFile = File(oldPath);
      String imageName = oldPath.substring(oldPath.indexOf('tmp') + 3);
      String basicPath = await ImageUtil.pictureInputBasicPath();
      String newPath = basicPath + imageName;
      final newDirectory = Directory(basicPath);
      newDirectory.createSync(recursive: true);
      await oldImageFile.copy(newPath);
      newListPath.add(imageName);
    });

    return newListPath;
  }
相关推荐
明似水2 小时前
2025年Flutter初级工程师技能要求
flutter
程序猿阿伟5 小时前
《从像素到身份:Flutter如何打通社交应用人脸识别的技术闭环》
flutter
周胡杰1 天前
鸿蒙接入flutter环境变量配置windows-命令行或者手动配置-到项目的创建-运行demo项目
javascript·windows·flutter·华为·harmonyos·鸿蒙·鸿蒙系统
程序猿阿伟1 天前
《React Native与Flutter:社交应用中用户行为分析与埋点统计的深度剖析》
flutter·react native·react.js
肥肥呀呀呀1 天前
在Flutter上如何实现按钮的拖拽效果
前端·javascript·flutter
WDeLiang2 天前
Flutter - UIKit开发相关指南 - 导航
flutter·ios·dart
程序猿阿伟2 天前
《Flutter社交应用暗黑奥秘:模式适配与色彩的艺术》
前端·flutter
融云3 天前
集成指南:如何采用融云 Flutter IMKit 实现双端丝滑社交体验
flutter
EndingCoder3 天前
跨平台移动开发框架React Native和Flutter性能对比
flutter·react native·react.js
Double Point3 天前
`RotationTransition` 是 Flutter 中的一个动画组件,用于实现旋转动画效果
flutter