WPF程序?qū)⒖丶尸F(xiàn)的內(nèi)容保存成圖像
有的時候,我們需要將控件所呈現(xiàn)的內(nèi)容保存成圖像保存下來,例如:InkCanvas的手寫墨跡,WebBrowser中的網(wǎng)頁等??赡苡腥藭f,這個不就是截圖嘛,找到控件的坐標(biāo)和大小,調(diào)用截圖API不就可以了嘛。的確,對于規(guī)則的控件來說,通過截圖的卻可以實(shí)現(xiàn),可是,如果控件不規(guī)則或不透明度不是100%,則會把其背景控件的視覺效果也給截取下來。
要實(shí)現(xiàn)只對控件進(jìn)行截圖,可以利用RenderTargetBitmap類獲取Visual對象的視覺效果,從而實(shí)現(xiàn)對控件截圖效果。
RenderTargetBitmap RenderVisaulToBitmap(Visual vsual, int width, int height)
{
var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default);
rtb.Render(vsual);
return rtb;
}這里需要說明一下,Visual對象的Alignment、Margin等影響布局的屬性也會獲取下來,例如,對如下按鈕截圖時,
<Button Content="Button" Margin="10,10,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="75" Height="22" />
按鈕的起點(diǎn)坐標(biāo)就不是(0,0),而是(10,10)。如果我們要把按鈕的起點(diǎn)起點(diǎn)坐標(biāo)設(shè)置為(0,0),則需要在Button屬性把Alignment、Margin等屬性去掉。既要去掉Alignment、Margin等屬性,又要保持按鈕的位置和大小不變,一個簡單的做法是在按鈕外面添加一個Border,在Broder中設(shè)置這些屬性(在VisualStudio和Blend中設(shè)置一下分組即可,一步即可完成)。
<Border Margin="10,10,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="75" Height="22">
<Button Content="Button"/>
</Border>通過RenderVisaulToBitmap函數(shù),就可以把控件的視覺效果轉(zhuǎn)換為RenderTargetBitmap對象了,RenderTargetBitmap對象繼承自BitmapSource,是可以直接在Image控件中顯示的。如果要更進(jìn)一步把它轉(zhuǎn)換為圖像,則可以按照我以前的文章給圖片加上陰影效果文章所示通過一個PngBitmapEncoder把BitmapSource對象保存為圖片。
public enum ImageFormat { JPG, BMP, PNG, GIF, TIF }
void GenerateImage(BitmapSource bitmap, ImageFormat format, Stream destStream)
{
BitmapEncoder encoder = null;
switch (format)
{
case ImageFormat.JPG:
encoder = new JpegBitmapEncoder();
break;
case ImageFormat.PNG:
encoder = new PngBitmapEncoder();
break;
case ImageFormat.BMP:
encoder = new BmpBitmapEncoder();
break;
case ImageFormat.GIF:
encoder = new GifBitmapEncoder();
break;
case ImageFormat.TIF:
encoder = new TiffBitmapEncoder();
break;
default:
throw new InvalidOperationException();
}
encoder.Frames.Add(BitmapFrame.Create(bitmap));
encoder.Save(destStream);
}以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#使用dynamic一行代碼實(shí)現(xiàn)反射操作
dynamic的出現(xiàn)讓C#具有了弱語言類型的特性。編譯器在編譯的時候不再對類型進(jìn)行檢查,編譯時默認(rèn)dynamic對象支持你想要的任何特性,這篇文章主要介紹了C#用dynamic一行代碼實(shí)現(xiàn)反射操作,需要的朋友可以參考下2023-04-04
DevExpress之ChartControl創(chuàng)建Drill-Down樣式的Title實(shí)例
這篇文章主要介紹了DevExpress之ChartControl創(chuàng)建Drill-Down樣式的Title實(shí)現(xiàn)方法,以實(shí)例形式講述了創(chuàng)建Drill-Down樣式的Title原理與實(shí)現(xiàn)過程,需要的朋友可以參考下2014-10-10
C#調(diào)用OutLokk實(shí)現(xiàn)發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了如何利用C#調(diào)用OutLokk實(shí)現(xiàn)發(fā)送郵件的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12
C#使用Twain協(xié)議開發(fā)一個高掃儀對接功能
這篇文章主要為大家詳細(xì)介紹了C#如何使用Twain協(xié)議開發(fā)一個高掃儀對接功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02

