【WPF】大量Canvas转换为本地图片遇到的问题

  • 2019 年 10 月 3 日
  • 笔记

?????https://www.cnblogs.com/younShieh/p/11279420.html

?

??

?????????????????????????Canvas???????????
??????????Canvas?????????????????????????????


?

???????

??????????????????????????????????BitmapSource????????PngBitmapEncoder() ???????????

//path?????  using (FileStream outStream = new FileStream(path, FileMode.Create))  {      PngBitmapEncoder encoder = new PngBitmapEncoder();      encoder.Frames.Add(BitmapFrame.Create(bitmapSource));      encoder.Save(outStream);  }

?

Canvas???

?? ????????????????????????Canvas???Bitmap??RenderTargetBitmap() ???????Visual???????????Canvas????Visual?????????????????????????????

 RenderTargetBitmap bitmap = new RenderTargetBitmap((int)canvas.ActualWidth, (int)canvas.ActualHeight, 96, 96, PixelFormats.Pbgra32);   bitmap.Render(canvas);

?

Canvas?????

??????????????????Canvas??????????ActualWidth?ActualHeight???????0??????????????????????????????????????ActualWidth?ActualHeight??????MSDN????

???????????????????????
????????????????????????????????????Width???????????
??ActualWidth???????????????????????????????????????????????????????????????????

?
??MSDN?????????????????????????????ActualWidth?ActualHeight???????????????????????????Canvas??????????????????????????????????????????????????????????????????????????????

https://stackoverflow.com/questions/5189139/how-to-render-a-wpf-usercontrol-to-a-bitmap-without-creating-a-window

?????????????????????????????????????????Measure() ???Arrange() ???Canvas????????????????????????????????????????????????????????????????

canvas.Measure(new Size(300, 300));  canvas.Arrange(new Rect(new Size(300,300)));

?

?????

??1. ????????????????Cancas????????????????????????????????????Canvas??????????????????????~??????????????????? ???????????????????????????? GC.Collect(); Dispose(); using()?????????? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????Measure() ???Arrange() ?????????????????????????
?
??2. ?????????????????????????????????????????????????????????RenderTargetBitmap() ? ????????????????????????????????????????????????????Arrange() ???????????????????????????????????????????
?
??3. baidu?google?????MSDN?stackoverflow???????????????????????????????????????????????????????????????????????Canvas ?????Dispose() ?????????????Dispose()???????IDisposable?”????????????????Canvas?????Dispose() ????????????????Arrange() ??? Dispose() ???????Canvas???Arrage?????? InvalidateArrange() ???

?????????????? ?????????????????????????????????? System.Windows.UIElement.UpdateLayout?????

?????????????????????????????????????????????????????“???????”???????????????????????????????????~~~

??????

canvas.Measure(new System.Windows.Size(1920, 1080));  canvas.Arrange(new Rect(0, 0, 1920, 1080));  renderBitmap.Render(canvas);  canvas.InvalidateArrange();  canvas.InvalidateMeasure();  canvas.UpdateLayout();

?
??????????????????????????????????????

?????