利用WPF绘制轮廓并保存为图片

1.前言        

        WPF作为显示工具也挺好用,用C#开发应用软件会比较省力,当然也有其缺点,如在对效率要求较高的情况下有性能问题,本文记录用WPF绘制轮廓并保存为图片相关内容。

         显示效果也还不错,满足调试使用了,

2.代码

private static void DrawCurve(DrawingContext drawingContext, Pen pen, ICurve iCurve){if(iCurve is HLine2d){var point0 = iCurve.GetEndPoint(0);var point1 = iCurve.GetEndPoint(1);drawingContext.DrawLine(pen, new Point(point0.X, point0.Y), new Point(point1.X, point1.Y));}else if(iCurve is HArc2d){var point0 = iCurve.GetEndPoint(0);var point1 = iCurve.GetEndPoint(1);var pt0 = new Point(point0.X, point0.Y);var pt1 = new Point(point1.X, point1.Y);var hArc = iCurve as HArc2d;Point center = new Point(hArc.Center.X, hArc.Center.Y);bool bLarge = hArc.Large;bool bClockWise = !hArc.ClockWise;  //窗体坐标系为左手double radius = hArc.Radius;PathFigure figure = new PathFigure() { StartPoint = pt0, IsFilled = false };PathGeometry path = new PathGeometry();path.Figures.Add(figure);SweepDirection dirSweep = bClockWise ? SweepDirection.Clockwise : SweepDirection.Counterclockwise;ArcSegment line = new ArcSegment(pt1, new Size(radius, radius), 0.0, bLarge, dirSweep, true);figure.Segments.Add(line);drawingContext.DrawGeometry(null, pen, path);}}
public static System.Drawing.Bitmap ConvertPatternToBitmap2(List<ICurve> lstICurve, List<List<ICurve>> lstIHatchProfile,System.Windows.Size imageSize, double? dLengthLabel = null, double? dWidthLabel = null){var curvesTemp = new List<ICurve>();curvesTemp.AddRange(lstICurve);lstIHatchProfile?.ForEach(s => { curvesTemp.AddRange(s); });//  获取满布居中转换矩阵var matTrans = CurveUtils.GetScaleMatrix(curvesTemp, new Size(imageSize.Width, imageSize.Height - 12));//  转换到满布居中HMatrix3 mat = new HMatrix3();mat.M00 = matTrans.Value.M11;mat.M01 = matTrans.Value.M12;mat.M10 = matTrans.Value.M21;mat.M11 = matTrans.Value.M22;mat.M02 = matTrans.Value.OffsetX;mat.M12 = matTrans.Value.OffsetY;lstICurve = CurveUtils.CreateTransform(lstICurve, mat);for (int cntItem = 0; cntItem < lstIHatchProfile.Count; cntItem++){lstIHatchProfile[cntItem] = CurveUtils.CreateTransform(lstIHatchProfile[cntItem], mat);}//  创建虚拟画布DrawingVisual drawingVisual = new DrawingVisual();DrawingContext drawingContext = drawingVisual.RenderOpen();Rect rect = new Rect(new Point(0, 0), imageSize);drawingContext.DrawRectangle(Brushes.White, (Pen)null, rect);Pen pen = new Pen(Brushes.Black, 2);foreach (var icurve in lstICurve){DrawCurve(drawingContext, pen, icurve);}int cntPro = -1;foreach (var profile in lstIHatchProfile){DrawProfile(drawingContext, Brushes.LightBlue, pen, profile);var boundBox = CurveUtils.GetBoundBox(profile);var dir = boundBox.MaxPoint - boundBox.MinPoint;double fontSize = Math.Max(15.0, Math.Min(dir.X, dir.Y) * 0.2);DrawText(drawingContext, (++cntPro).ToString(), boundBox.Center, fontSize);}DrawLabel(drawingContext, dLengthLabel, dWidthLabel, imageSize);drawingContext.Close();//截虚拟画布并生成为本地图片文件RenderTargetBitmap bmp = new RenderTargetBitmap((int)imageSize.Width, (int)imageSize.Height, 96, 96, PixelFormats.Pbgra32);bmp.Render(drawingVisual);BitmapEncoder encoder = new JpegBitmapEncoder();encoder.Frames.Add(BitmapFrame.Create(bmp));using (MemoryStream stream = new MemoryStream()){encoder.Save(stream);return new System.Drawing.Bitmap(stream);}}

 3.效果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143586.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

使用JS实现tab栏切换

重要知识点了解 环境对象&#xff08;this&#xff09; 1.环境对象&#xff1a;指的是函数内部特殊的变量 this 2.this的使用&#xff1a;当我们在一个函数里面需要去调用一个变量是。需要去引用如 函数的调用方式不同&#xff0c;this 指代的对象也不同 【谁调用&…

应用AI技术的销售进化论

该文章聚焦AI技术在销售行业中的实际应用&#xff0c;解读销售人员如何利用先进技术及工具突破传统限制&#xff0c;增强业务能力帮助销售人员保持竞争优势&#xff0c;提升工作效率与业绩。 1、AI如何重塑销售规则 1.1 AI在销售领域的应用&#xff1a;不只是数字游戏 在销售…

python调用c++动态链接库,环境是VS2022和vscode2023

目录 前言&#xff1a;配置环境&#xff1a;基础夯实&#xff08;对于ctypes的介绍&#xff09;&#xff1a;1. 加载共享库2. 定义函数原型3. 调用函数4. 处理数据结构5. 处理指针6. 错误处理7. 使用 ctypes.util总结 效果展示&#xff1a;操作步骤(保姆级教学)一在VS中创建dll…

train_llava记录

首先时build_model 【自定义多模态大模型LLaVA——LLaVA系列】 https://www.bilibili.com/video/BV1GS411P74b/?share_sourcecopy_web&vd_source820e17ab3d5412c1c94e68f2e5f07ae7 作者用的4B的qwen1.5 但是这里发现3090是只能部署但是推理爆显存所以只能换成0.5B的 问…

计算机毕业设计汽车选购销售平台管理系统车辆用户分类订单评价购买/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

‌计算机毕业设计&#xff1a;汽车选购销售平台管理系统‌ ‌一、项目概述‌ 本毕业设计项目旨在构建一个全面的汽车选购销售平台管理系统&#xff0c;该系统将涵盖车辆管理、用户分类、订单处理、评价系统以及购买功能。通过采用Spring Boot、JavaWEB、J2EE等后端技术&#…

【java系】记录一次ClassLoader.getResourceAsStream获取不到文件流

问题描述反馈&#xff0c;开发同事在本地获取对应文件流是可以正常业务操作&#xff0c;发布到linux服务器对应环境就会出现异常。 源码部分截图 看到这里&#xff0c;我猜想是否和window底层文件操作系统不区分大小写有关呢&#xff1f;而服务器linux是严格区分大小写这个应该…

黑神话悟空mac可以玩吗

黑神话悟空mac上能不能玩对于苹果玩家来说很重要&#xff0c;那么黑神话悟空mac可以玩吗&#xff1f;目前是玩不了了&#xff0c;没有针对ios系统的版本&#xff0c;只能之后在云平台上找找了&#xff0c;大家可以再观望下看看。 黑神话悟空mac可以玩吗 ‌使用CrossOver‌&…

场外期权或成暴利工具?!应该怎么做场外期权?

今天带你了解场外期权或成暴利工具&#xff1f;&#xff01;应该怎么做场外期权&#xff1f;通过深入了解市场、选择合适的通道商、制定清晰的策略和有效的风险管理&#xff0c;可以在场外期权交易中取得更好的结果。 什么是场外期权&#xff1f; 场外期权是交易所以外的市场…

【店雷达全网图搜比价盘点】1688、淘宝、阿里国际、亚马逊、速卖通5大平台

全网图搜比价的意义&#xff0c;对于商家来说的意义在于可以对比不同供应商提供的同款或类似产品的价格&#xff0c;找出性价比高且质量可靠的商品&#xff0c;确保在运费和其他成本考虑下仍能保持合理利润空间&#xff0c;挑选出更具性价比且可靠的商品有效降低选品风险。 店…

ubuntu安装wordpress(基于LNMP环境)

参考链接 Ubuntu安装LNMP 安装步骤 环境需要LNMP环境&#xff0c;如果没有安装可以参考ZATA—LNMP简单安装 在mysql中设置wordpress所用的用户名和密码 #1. 登录mysql mysql -uroot -p #2. 创建wordpress数据库 create database wordpress; #3. 创建新用户user&#xff0c;…

ES分词导致查询结果不准确

问题现象 索引里面有数据&#xff0c;而没有查询出来。 如下图所示&#xff0c;术语库&#xff08;索引&#xff09;中里面有一条数据的原文是“层”&#xff0c;而根据完整的原文来查询该原文中的术语&#xff0c;并未将该术语查询出来。 根据原文查询该原文中的术语&#x…

飞睿智能UWB BLE Tag蓝牙防丢器模块,APP测距定位一键绑定,安全守护每一刻

我们总在不经意间与生活中的小物件擦肩而过——钥匙遗忘在咖啡厅的角落&#xff0c;钱包遗失在拥挤的地铁&#xff0c;甚至孩子的书包在人群中悄然消失……每一次的失而复得都是幸运的眷顾&#xff0c;但更多的是遗憾与不便。今天&#xff0c;就让我带你走进一个智能守护的新世…

如何在多台Linux虚拟机上安装和配置Kafka集群

Kafka是一个高性能、分布式的流处理平台&#xff0c;被广泛应用于大规模实时数据处理场景。它具有高吞吐量、低延迟和可水平扩展等特点&#xff0c;能够有效地处理海量数据流。为了提高Kafka的可用性和容错性&#xff0c;通常会在多个节点上部署Kafka集群。在这个指南中&#x…

银行监管报送系统系列介绍(二十):资产减值准备规则变迁与报送要求

资产减值准备是商业银行识别和防范信用风险的重要工具。自2002年人民银行发布《贷款损失准备计提指引》以来,我国对于减值准备的计提与考察规则逐步完善。目前许多监管模块都要求统计各类业务的减值准备,不同报表的统计口径和粒度也不尽相同。因此我们综述了填报说明中依据的…

react + antDesignPro 企业微信扫码登录

效果 实现步骤 1、项目中document.ejs文件引入企微js链接 注意&#xff1a;技术栈是使用的react antDesignPro&#xff0c;不同的技术栈有不同的入口文件&#xff08;如vue在html文件引入&#xff09; <script src"https://wwcdn.weixin.qq.com/node/wework/wwopen/j…

Maximum call depth exceeded 【解决】

Maximum call depth exceeded 【解决】 在前端开发中&#xff0c;Maximum call depth exceeded 是一个常见的错误信息&#xff0c;它通常与递归调用深度过深有关。当 JavaScript 引擎执行递归函数时&#xff0c;如果递归层次过多&#xff0c;会超出调用栈的最大深度&#xff0c…

离散制造 vs 流程制造:锚定精准制造未来,从装配线到化学反应,实时数据集成在制造业案例中的多维应用

使用 TapData&#xff0c;化繁为简&#xff0c;摆脱手动搭建、维护数据管道的诸多烦扰&#xff0c;轻量替代 OGG, Kettle 等同步工具&#xff0c;以及基于 Kafka 的 ETL 解决方案&#xff0c;「CDC 流处理 数据集成」组合拳&#xff0c;加速仓内数据流转&#xff0c;帮助企业…

了解变压器电压调节抽头

提供给变压器初级的电压可能与标称值不同。大多数公用事业公司将提供标称额定值 5% 以内的电压&#xff1b;但是&#xff0c;设施内的电压下降可能会导致提供给变压器的实际电压低于标称值 5% 以上。公用事业供应也可能有所不同。向变压器初级提供与额定初级电压不同的电压会导…

从零手写大模型,零基础入门到精通,收藏这一篇就够了

这里为从零手写大模型的实战课程介绍。 1、课程定位 如果你想成为真正懂 AI、可以写代码进行 AI 模型开发、对大模型的底层技术很了解的技术性人才&#xff0c;就来这里从零学习手写大模型吧。 本课程适合以下的同学&#xff1a; 1、希望从事AI 算法开发、大模型开发的同学…

基于yolov8的红外小目标无人机飞鸟检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的红外小目标无人机与飞鸟检测系统是一项集成了前沿技术的创新解决方案。该系统利用YOLOv8深度学习模型的强大目标检测能力&#xff0c;结合红外成像技术&#xff0c;实现了对小型无人机和飞鸟等低空飞行目标的快速、准确检测。 YOLOv8作为YOLO系列的…