/// <summary> /// This function convert the Canvas control to the Bitmap Image. /// </summary> /// <param name="surface"> /// Canvas control Object want to convert. /// </param> /// <returns> /// Bitmap Object containing Canvas control Image. /// </returns> public static System.Drawing.Bitmap CanvasToBitmap(System.Windows.Controls.Canvas surface) { System.Drawing.Bitmap BmpOut = null; try { try { File.Delete("C:\\Images\\Img.jpg"); } catch (Exception) { } Uri path = new Uri("C:\\Images\\Img.jpg"); // Save current canvas transform Transform transform = surface.LayoutTransform; // reset current transform (in case it is scaled or rotated) surface.LayoutTransform = null; // Get the size of canvas Size size = new Size(surface.ActualWidth, surface.ActualHeight); // Measure and arrange the surface // VERY IMPORTANT surface.Measure(size); surface.Arrange(new Rect(size)); // Create a render bitmap and push the surface to it RenderTargetBitmap renderBitmap = new RenderTargetBitmap( (int)size.Width, (int)size.Height, 96d, 96d, PixelFormats.Pbgra32); renderBitmap.Render(surface); // Create a file stream for saving image using (FileStream outStream = new FileStream(path.LocalPath, FileMode.Create)) { // Use png encoder for our data PngBitmapEncoder encoder = new PngBitmapEncoder(); // push the rendered bitmap to it encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); // save the data to the stream encoder.Save(outStream); } // Restore previously saved layout surface.LayoutTransform = transform; Thread.Sleep(200); BmpOut = new System.Drawing.Bitmap("C:\\Images\\Img.jpg"); } catch (Exception) { } return(BmpOut); }
// renders a bitmap image and save as a png file public static void RenderImage(int width, int height, string path, System.Windows.Controls.Canvas canvas) { canvas.Measure(new Size(width, height)); canvas.Arrange(new Rect(new Size(width, height))); RenderTargetBitmap renderBitmap = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32); renderBitmap.Render(canvas); PngBitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); using (FileStream file = File.Create(path)) { encoder.Save(file); } }
/// <summary> /// Avi : 14 Feb ; Kraus RGA Project. /// Export the canvas to the Images withe the file name. /// used in the camera screen to capture the images. /// </summary> /// <param name="path"> /// String pathe of the images to be save with the image extension. /// </param> /// <param name="surface"> /// Canvas control to be converted in to image. /// </param> public static void CanvasExportToPng(Uri path, System.Windows.Controls.Canvas surface) { if (path == null) { return; } // Save current canvas transform Transform transform = surface.LayoutTransform; // reset current transform (in case it is scaled or rotated) surface.LayoutTransform = null; // Get the size of canvas Size size = new Size(surface.ActualWidth, surface.ActualHeight); // Measure and arrange the surface // VERY IMPORTANT surface.Measure(size); surface.Arrange(new Rect(size)); // Create a render bitmap and push the surface to it RenderTargetBitmap renderBitmap = new RenderTargetBitmap( (int)size.Width, (int)size.Height, 96d, 96d, PixelFormats.Pbgra32); renderBitmap.Render(surface); // Create a file stream for saving image using (FileStream outStream = new FileStream(path.LocalPath, FileMode.Create)) { // Use png encoder for our data PngBitmapEncoder encoder = new PngBitmapEncoder(); // push the rendered bitmap to it encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); // save the data to the stream encoder.Save(outStream); } // Restore previously saved layout surface.LayoutTransform = transform; }
public void GenRangeBrush() { //处理点集 for (int i = 0; i < drawObjects.Count; i++) { StruDrawObjDesc objdesc = drawObjects[i]; string[] ss = objdesc.strPoints.Split(' '); int pointcount = ss.Length; List <Point> points = new List <Point>(); Point pnt = new Point(0, 0); for (int j = 0; j < pointcount; j++) { pnt = Point.Parse(ss[j]); points.Add(pnt); } objdesc.listpnts = points; } //miny = dots.Min(p => p.location.X); maxy = dots.Max(p => p.location.X); //将经度换为X坐标, 纬度换为Y坐标 //minx = dots.Min(p => p.location.Y); maxx = dots.Max(p => p.location.Y); miny = drawObjects.Min(p1 => p1.listpnts.Min(p2 => p2.X)); maxy = drawObjects.Max(p1 => p1.listpnts.Max(p2 => p2.X)); minx = drawObjects.Min(p1 => p1.listpnts.Min(p2 => p2.Y)); maxx = drawObjects.Max(p1 => p1.listpnts.Max(p2 => p2.Y)); double w = maxx - minx; double h = maxy - miny; //minx = minx - w * 0.2; maxx = maxx + w * 0.2; //miny = miny - h * 0.2; maxy = maxy + h * 0.2; minx = minx - 0.01; maxx = maxx + 0.01; //改为扩展固定大小 miny = miny - 0.01; maxy = maxy + 0.01; w = maxx - minx; h = maxy - miny; //经纬换为屏幕坐标 int size = 1024; double ww = w > h ? size : size * w / h; double hh = w > h ? size * h / w : size; double scalerad = size / Math.Max(w, h) / 10000; Size canvSize = new Size(ww, hh); for (int i = 0; i < drawObjects.Count; i++) { StruDrawObjDesc objdesc = drawObjects[i]; List <Point> lp = objdesc.listpnts; PointCollection pc = new PointCollection(); int pointcount = lp.Count; foreach (Point pp in lp) { Point tmp = new Point((pp.Y - minx) / w * canvSize.Width, (maxy - pp.X) / h * canvSize.Height); //重新赋与新的平面点位置, 注,纬度取反,仅适用北半球 pc.Add(tmp); } objdesc.pc = pc; objdesc.listpnts = null; } //绘制 canv.Children.Clear(); canv.Children.Add(new Rectangle() { Width = canvSize.Width, Height = canvSize.Height, StrokeThickness = 10, Stroke = Brushes.Transparent }); //生成geo PathGeometry pg = new PathGeometry(); foreach (StruDrawObjDesc objdesc in drawObjects) { PathFigure pf = new PathFigure(); pg.Figures.Add(pf); pf.Segments.Add(new PolyLineSegment()); pf.StartPoint = objdesc.pc[0]; (pf.Segments[0] as PolyLineSegment).Points = objdesc.pc; } for (int i = layerCount - 1; i >= 0; i--) { Path path = new Path(); path.Data = pg; path.Stroke = brush; path.StrokeStartLineCap = path.StrokeEndLineCap = PenLineCap.Round; path.StrokeLineJoin = PenLineJoin.Round; path.StrokeThickness = rad * scalerad * (i + 1) / layerCount; //path.Opacity = ((1.0f*layerCount - i ) / layerCount); path.Fill = Brushes.Transparent; path.Effect = new BlurEffect() { Radius = blueRadius * scalerad }; canv.Children.Add(path); } canv.Effect = new BlurEffect() { Radius = Math.Max(canvSize.Width, canvSize.Height) / blurFactor }; RangeBrush = new VisualBrush(); RangeBrush.Visual = canv; canv.Measure(canvSize); canv.Arrange(new System.Windows.Rect(0, 0, canvSize.Width, canvSize.Height)); canv.Measure(canvSize); canv.Arrange(new System.Windows.Rect(0, 0, canvSize.Width, canvSize.Height)); }