公司要求拍照以后返回加一层水印在照片上,网上找了几个组件本来都实现了结果发现只有英文不给写中文气得要死
整体来说就是这个方法,思路就是把照片当做画布然后再画一个水印出来设置透明背景把两张图拼在一起 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;
}