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

1.前言

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

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

2.代码

cs 复制代码
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);
         }
      }
cs 复制代码
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.效果

相关推荐
李宥小哥17 小时前
C#基础10-结构体和枚举
java·开发语言·c#
玖笙&1 天前
✨WPF编程基础【2.1】布局原则
c++·wpf·visual studio
玖笙&1 天前
✨WPF编程基础【2.2】:布局面板实战
c++·wpf·visual studio
SEO-狼术1 天前
.NET WPF 数据编辑器集合提供列表框控件
.net·wpf
secondyoung2 天前
Markdown转换为Word:Pandoc模板使用指南
开发语言·经验分享·笔记·c#·编辑器·word·markdown
andyguo2 天前
AI模型测评平台工程化实战十二讲(第五讲:大模型测评分享功能:安全、高效的结果展示与协作)
人工智能·安全·c#
大飞pkz2 天前
【设计模式】访问者模式
开发语言·设计模式·c#·访问者模式
LateFrames2 天前
用 【C# + Winform + MediaPipe】 实现人脸468点识别
python·c#·.net·mediapipe
R-G-B3 天前
【14】C#实战篇——C++动态库dll 接口函数将char* strErr字符串 传给C# ,并且在winform的MessageBox和listbox中显示。C++ string 日志传给 C#
c++·c#·strerr字符串传给c#·动态库dll传递字符串给c#·string日志传给c#·c++ string传给 c#·c++底层函数日志传给c#显示
我是唐青枫3 天前
深入掌握 FluentMigrator:C#.NET 数据库迁移框架详解
数据库·c#·.net