当前位置: 首页 > news >正文

利用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.mrgr.cn/news/29572.html

相关文章:

  • Redisson 中开启看门狗(watchdog)机制
  • RabbitMQ集群搭建
  • Kafka参数了解
  • 推荐一个超漂亮ui的网页应用设计
  • SL1571B 输入5V2A或单节锂电池,升压12V 10W 升压恒压芯片
  • android dvr黑屏
  • 文件保护措施:防止文件误删、覆盖及恶意篡改的策略探讨
  • c++设计模式
  • 珠海市自闭症寄宿学校,为孩子打造温馨成长环境
  • python队列操作
  • 李沐也看好的方向:多模态预训练!最新成果刷爆SOTA,轻松拿下顶会
  • arm
  • 蚂蚁在 RAG 与向量检索上的实践:技术应用与创新分析
  • 新书出版,大陆首本NestJS图书《NestJS全栈开发解析:快速上手与实践》
  • SDKMAN!软件开发工具包管理器
  • JS全选反选案例
  • 组合式 API 和选项式 API的区别
  • VulhubDC-4靶机详解
  • EtherCAT 转 Profinet 网关在深海钻探工作中的作用
  • Java小区物业管理系统
  • axure的下载,激活,汉化全过程,多图
  • 计算机知识科普问答--12 (56-60)
  • git pull的merge和rebase模式
  • 闲置物品交易系统小程序的设计
  • PWM控制技术(基本思想、逆变电路及其控制方法)
  • macOS平台TensorFlow环境安装