使用.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對象

 
如想保存成jpg格式:
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)函數來保存圖像。因為這里只支持保存到流,不支持直接保存到文件,所以需要先創建文件,再進行保存。

 

推薦閱讀

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM