flutter图片添加水印

news/2024/12/22 23:44:03/

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,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);}

调用

//图片添加水印addWatermarkToImages(BuildContext context) async{waterImages.clear();if(addWaterMark && state.selectImageList.length>0){ByteData byteData;for (int i = 0; i < state.selectImageList.length; i++) {Asset asset = state.selectImageList[i];byteData = await asset.getByteData();String watermarkImagePath =await Utils().addWatermarkToImage(byteData.buffer.asUint8List(),markUInt8List: watermarkUint8List,markUserName: userInfo.user.nickname);if(watermarkImagePath != null && watermarkImagePath.isNotEmpty){waterImages.add(watermarkImagePath);print('==waterImages length=$i=${waterImages.length}');}}//发布submit(context);update();}}

http://www.ppmy.cn/news/843587.html

相关文章

头牌知产介绍棋类商标注册申请属于哪类?

棋类商标注册申请属于哪类&#xff1f;暑假即将来临&#xff0c;学生即将迎来两个月的假期&#xff0c;合理的安排&#xff0c;丰富假期的生活&#xff0c;棋类会是他们很好的选择。有段时间《棋魂》风靡&#xff0c;大家惊叹主演的高超围棋技艺。围棋也是众多棋类的一种&#…

侵权风波不断,美国专利及商标局着手研究NFT对著作权的影响

今年2月Nike指控网络运动用品经销商StockX推出的NFT侵权吵得沸沸扬扬&#xff0c;NFT 热度虽降温&#xff0c;但想借此延伸的著作权相关的创作仍不断投入&#xff0c;参议员Patrick Leahy 和Thom Tillis在6月时要求政府深入研究NFT对知识财产权产生的可能的影响&#xff0c;因此…

centos和ubuntu有什么区别

区别&#xff1a;1、centos基于EHEL开发&#xff0c;而ubuntu基于Debian开发&#xff1b;2、centos使用rpm和flatpak软件包&#xff0c;而ubuntu使用deb和snap的软件包&#xff1b;3、centos使用yum来更新&#xff0c;而ubuntu使用apt来更新。 centos和ubuntu有什么区别 Linux…

蹭商标的新高度:有一种“山寨”,叫货不对“标”

文|螳螂观察 作者|李永华 如果问到网上买东西最怕的是什么&#xff0c;恐怕答案最多的会是“买到假货”&#xff0c;尤其在海购时代&#xff0c;渠道难以透明化&#xff0c;偷梁换柱山寨产品&#xff0c;甚至用真包装、假货品的现象屡屡出现。正因为如此&#xff0c;这些年电…

因特网和内联网

Web是解决客户机&#xff0f;服务器问题的一种常用方案&#xff0c;所以最好能用相同的技术解决此类问题的一些“子集”&#xff0c; 特别是公司内部的传统客户机&#xff0f;服务器问题。对于传统的客户机&#xff0f;服务器模式&#xff0c;我们面临的问题是拥有多种 不同类型…

小公司想通过商标和专利pk腾讯结果惨败成炮灰

目前还没有小公司&#xff0c;或者奇虎那样大公司能从腾讯起诉较量中获得胜利&#xff0c;均以失败告终。只能告诉人们&#xff0c;在中国想通过商标和专利发展公司是不可能的。 山寨破解&#xff0c;让你头疼。有时候你的软件/硬件还没卖出一套&#xff0c;破解版已经流出来了…

初入HTML和CSS

初入HTML和CSS 1.1 HTML、CSS1.2 如何去写代码&#xff1f;写到哪里去1.3 宇宙第一编辑器 VS CodeVS Code的基本使用1.4 浏览器1.5 深入了解网站开发1.6HTML1.7 HTML的注释1.9 HTML标题与段落2.0HTML文本修饰标签2.5特殊符号2.6列表标签 一、第一部分 #拨云见日&#xff1a; **…

如何申请鸿蒙os 2.0系统,鸿蒙OS 2.0将至,华为申请大量鸿蒙商标

原标题&#xff1a;鸿蒙OS 2.0将至&#xff0c;华为申请大量鸿蒙商标 7月8日&#xff0c;天眼查数据显示&#xff0c;华为申请了一大批与鸿蒙有关的商标&#xff0c;目前正在等待审查。鉴于华为手机业务在国外的艰难处境&#xff0c;有分析称&#xff0c;华为下半年或许会迎来发…