奈何想法与现实相左,后台创建控件,其控件大小虽有设置,但其实际并没有宽高。因此生成出的图片文件是张黑色图片。因此,经过深入研究,引进了建立虚拟画布、并在其中画图的方式,来替换掉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);
}