WPF 后台图片绘制线段并生成本地图片文件

来源:互联网 发布:360数据恢复软件比较差 编辑:程序博客网 时间:2024/05/17 23:59
前期想法是在后台中new 一个Canvas控件,并在其中将图片和线条放入其中,再通过截控件的方式生成出图片文件。
奈何想法与现实相左,后台创建控件,其控件大小虽有设置,但其实际并没有宽高。因此生成出的图片文件是张黑色图片。因此,经过深入研究,引进了建立虚拟画布、并在其中画图的方式,来替换掉Canvas。

借此,将代码归纳总结如下:

    //获取本地图片文件(单纯的调用uri会存在后续代码有文件被占用的隐患。在此做了间接转换,方便释放资源)
            //BitmapImage lb = new BitmapImage();
            //lb = new BitmapImage(new Uri("D:\\123.jpg", UriKind.Absolute));


            BinaryReader binReader = new BinaryReader(File.Open("D:\\123.jpg", FileMode.Open));
            FileInfo fileInfo = new FileInfo("D:\\123.jpg");
            byte[] bytes = binReader.ReadBytes((int)fileInfo.Length);
            binReader.Close();


            BitmapImage bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.StreamSource = new MemoryStream(bytes);
            bitmap.EndInit();


            Image Toimage = new Image();
            Toimage.Source = bitmap.Clone();




            #region 创建虚拟画布
            DrawingVisual drawingVisual = new DrawingVisual();
            DrawingContext drawingContext = drawingVisual.RenderOpen();


            //创建矩形区域
            ImageBrush imgbrush = new ImageBrush();
            imgbrush.ImageSource = Toimage.Source;
            Rect rect = new Rect(new Point(0, 0), new Size(355, 288));
            drawingContext.DrawRectangle(imgbrush, (Pen)null, rect);


            //创建画笔
            Pen pen = new Pen();
            pen.Brush = new SolidColorBrush(Color.FromRgb(1,255,0));
            pen.Thickness = 3;
            
            //画线
            drawingContext.DrawLine(pen, new Point(100,50), new Point(200,150));
            drawingContext.DrawLine(pen, new Point(200, 150), new Point(300, 150));
            drawingContext.DrawLine(pen, new Point(300, 150), new Point(100, 50));


            drawingContext.Close();
            #endregion


            //截虚拟画布并生成为本地图片文件
            RenderTargetBitmap bmp = new RenderTargetBitmap((int)355, (int)288, 96, 96, PixelFormats.Pbgra32);
            bmp.Render(drawingVisual);
            string file = @"D:\xxx.jpg";
            string Extension = System.IO.Path.GetExtension(file).ToLower();
            BitmapEncoder encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bmp));
            using (Stream stm = File.Create(file))
            {
                encoder.Save(stm);
            }