使用.Net Core開發WPF App系列教程(其它 、儲存控制元件內容為圖片)
在WPF中儲存控制元件內容為圖片
實現程式碼如下
1 private void SaveControlContentAsImage(FrameworkElement element,string fileName) 2 { 3 var render = new RenderTargetBitmap((int)element.ActualWidth, (int)element.ActualHeight, 96, 96, PixelFormats.Default); 4 render.Render(element);5 BitmapEncoder encoder = new JpegBitmapEncoder(); 6 //BmpBitmapEncoder 7 //GifBitmapEncoder 8 //PngBitmapEncoder 9 //TiffBitmapEncoder 10 11 encoder.Frames.Add(BitmapFrame.Create(render)); 12 using (System.IO.FileStream fs = System.IO.File.Create(fileName))13 { 14 encoder.Save(fs); 15 } 16 17 }
這裡主要用到RenderTargetBitmap、BitmapEncoder兩個類。這裡具體介紹一下這兩個類。
這個類的作用就是將Visual物件轉換為點陣圖。
使用步驟
1、通過建構函式構造一個RenderTargetBitmap物件
建構函式宣告如下:
1 public RenderTargetBitmap (int pixelWidth, intpixelHeight, double dpiX, double dpiY, System.Windows.Media.PixelFormat pixelFormat);
- pixelWidth:位置的寬度
- pixelHeight:位置的高度
- dpiX:水平DPI
- dpiY:垂直DPI
- pixelFormat:點陣圖的格式(使用PixelFormat列舉型別)
- 使用如下:
RenderTargetBitmap rtBitmap = new RenderTargetBitmap(180, 180, 120, 96, PixelFormats.Pbgra32);
2、呼叫Render(Visual)函式來渲染Visual物件
只要是Visual物件,都可以進行渲染。
在WPF介紹這篇文章中(https://www.cnblogs.com/zhaotianff/p/13373111.html),已經介紹了控制元件、面板、形狀都是繼承自Visual類,所以都可以用於Render函式渲染。
說明:
RenderTargetBitmap類繼承自System.Windows.Media.Imaging.BitmapSource,所以可以直接用於設定Image控制元件的ImageSource屬性,並進行顯示。
BitmapEncoder
這個類的作用是將BitmapFrame物件的集合編碼為影象流。
使用方法如下
1、BitmapEncoder繼承自以下類,根據想儲存的影象格式,例項化一個BitmapEncoder物件
System.Windows.Media.Imaging.BmpBitmapEncoder System.Windows.Media.Imaging.GifBitmapEncoder System.Windows.Media.Imaging.JpegBitmapEncoder System.Windows.Media.Imaging.PngBitmapEncoder System.Windows.Media.Imaging.TiffBitmapEncoder System.Windows.Media.Imaging.WmpBitmapEncoder 如想儲存成jpg格式:1 BitmapEncoder encoder = new JpegBitmapEncoder();
2、設定影象內容
通過設定BitmapEncoder.Frame屬性(System.Windows.Media.Imaging.BitmapFrame),可以設定影象內各幀。
BitmapFrame類是表示由解碼器返回並被編碼器接受的影象資料。通俗點來說,就是BitampFrame代表影象編碼過的幀。像JPG、BMP這樣的靜態影象,整個影象只有一幀。
BitmapFrame擁有一個過載的Create方法來建立BitmapFrame物件。Create常用的三種形式如下:
* 通過流來建立BitmapFrameBitmapFrame.Create(System.IO.Stream)
* 通過Uri來建立BitmapFrameBitmapFrame.Create(Uri)
* 通過BitmapSource來建立BitmapFrameBitmapFrame.Create(BitmapSource)
因為RenderTargetBitmap是繼承自BitmapSource類的,所以我們這裡選擇的是第三種過載。
1 encoder.Frames.Add(BitmapFrame.Create(render));
3、儲存影象
呼叫BitmapEncoder.Save(System.IO.Stream)函式來儲存影象。因為這裡只支援儲存到流,不支援直接儲存到檔案,所以需要先建立檔案,再進行儲存。
推薦閱讀