欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > Flutter实现水印打卡照片

Flutter实现水印打卡照片

2025/4/19 8:13:27 来源:https://blog.csdn.net/weixin_44285813/article/details/141190089  浏览:    关键词: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;}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词