在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, int pixelHeight, 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屬性,並進行顯示。
這個類的作用是將 BitmapFrame 對象的集合編碼為圖像流。
使用方法如下
1、BitmapEncoder繼承自以下類,根據想保存的圖像格式,實例化一個BitmapEncoder對象
1 BitmapEncoder encoder = new JpegBitmapEncoder();
2、設置圖像內容
通過設置BitmapEncoder.Frame屬性(System.Windows.Media.Imaging.BitmapFrame),可以設置圖像內各幀。
BitmapFrame類是表示由解碼器返回並被編碼器接受的圖像數據。通俗點來說,就是BitampFrame代表圖像編碼過的幀。像JPG、BMP這樣的靜態圖像,整個圖像只有一幀。
BitmapFrame擁有一個重載的Create方法來創建BitmapFrame對象。Create常用的三種形式如下:
* 通過流來創建BitmapFrame BitmapFrame.Create(System.IO.Stream)
* 通過Uri來創建BitmapFrame BitmapFrame.Create(Uri)
* 通過BitmapSource來創建BitmapFrame BitmapFrame.Create(BitmapSource)
因為RenderTargetBitmap是繼承自BitmapSource類的,所以我們這里選擇的是第三種重載。
1 encoder.Frames.Add(BitmapFrame.Create(render));
3、保存圖像
調用BitmapEncoder.Save(System.IO.Stream)函數來保存圖像。因為這里只支持保存到流,不支持直接保存到文件,所以需要先創建文件,再進行保存。
推薦閱讀