1. 程式人生 > 實用技巧 >使用.Net Core開發WPF App系列教程(其它 、儲存控制元件內容為圖片)

使用.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 }

這裡主要用到RenderTargetBitmapBitmapEncoder兩個類。這裡具體介紹一下這兩個類。

RenderTargetBitmap

這個類的作用就是將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屬性,並進行顯示。

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)函式來儲存影象。因為這裡只支援儲存到流,不支援直接儲存到檔案,所以需要先建立檔案,再進行儲存。

推薦閱讀

https://docs.microsoft.com/en-us/dotnet/api/system.windows.media.imaging.bitmapframe?view=netframework-4.8