阅读背景:

flutter图片添加水印

来源:互联网 

flutter为图片右下角添加上水印
在这里插入图片描述

//制造字符串水印图片 _makeStrMarkImage(String str, double fontSize) async { final picRecorder = ui.PictureRecorder(); final paragraphBuilder = ui.ParagraphBuilder( ui.ParagraphStyle( textAlign: TextAlign.left, fontSize: fontSize, ), ); paragraphBuilder.pushStyle(ui.TextStyle( fontSize: fontSize, color: Colors.white, shadows: <Shadow>[ Shadow( color: Color(0xFFF4F4F4).withAlpha(25), blurRadius: 1.0, offset: Offset(-3, 0), ), Shadow( color: Color(0xFFF4F4F4).withAlpha(25), blurRadius: 3.0, offset: Offset(-3, -3), ), ], )); paragraphBuilder.addText(str); final paragraph = paragraphBuilder.build() ..layout(ui.ParagraphConstraints( width: fontSize * 10.0, )); final lineMetrics = paragraph.computeLineMetrics(); double width = 0; lineMetrics.forEach((element) { if (element.width > width) { width = element.width; } }); final cvs = Canvas( picRecorder, Rect.fromLTRB(0, 0, width, paragraph.height,), ); cvs.drawParagraph(paragraph, Offset(0, 0)); final pic = picRecorder.endRecording(); final waterMark = await pic.toImage( width.toInt(), paragraph.height.toInt(), ); return waterMark; } //确定水印位置、大小,并将水印添加到原图 _makeImageMark(img.Image image, String markStr,img.Image imageLogo,[bool isLeft = true]) async { final imgHeight = image.height; final imgWidth = image.width; final ratio = imgWidth / 375.0; final fontSize = ratio * 24.0 ~/ 2.0; final edgeSize = ratio * 8.0 ~/ 2.0; final waterMarkImage = await _makeStrMarkImage(markStr, fontSize.toDouble()); final waterMarkBytes = await waterMarkImage.toByteData(format: ui.ImageByteFormat.rawRgba); final waterMarkImg = img.Image.fromBytes( waterMarkImage.width, waterMarkImage.height, Uint8List.sublistView(waterMarkBytes), ); final resizedImage = img.copyResize(imageLogo,width: edgeSize * 6,height: edgeSize * 3); int dstX; int dstY = imgHeight - waterMarkImg.height - edgeSize; if (isLeft) { dstX = edgeSize; } else { dstX = imgWidth - edgeSize - waterMarkImg.width; } img.copyInto( image, waterMarkImg, dstX: dstX, dstY: dstY, ); img.copyInto( image, resizedImage, dstX: dstX - (edgeSize * 7), dstY: dstY + edgeSize, ); } getDecodeImage(Uint8List uInt8List){ Completer<img.Image> completer = new Completer<img.Image>(); img.Image originImage = img.decodeImage(uInt8List); completer.complete(originImage); return completer.future; } /* * 图片左、右下脚添加图片+文字水印 * */ Future<String> addWatermarkToImage(Uint8List uInt8List,{ Uint8List markUInt8List,String markUserName}) async { File targetFile; if (uInt8List != null) { final markLogo = await getDecodeImage(markUInt8List); final originImage = await getDecodeImage(uInt8List); final Directory _directory = await getTemporaryDirectory(); final Directory _imageDirectory = await new Directory('${ _directory.path}/image/').create(recursive: true); String _targetPath = _imageDirectory.path; await _makeImageMark( originImage, markUserName==null?'' :'@$markUserName', markLogo, false); final bytes = img.writeJpg(originImage); targetFile = File('${ _targetPath}watermark${ DateTime.now().millisecondsSinceEpoch}.jpg'); targetFile.writeAsBytesSync(bytes); print('====targetFilePath=${ targetFile.path}'); } return Future.value(targetFile.path); } //制造字符串水印图片 _makeStrMarkImage(S



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: