日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

7.2.3 使用RenderTargetBitmap类生成图片

發布時間:2025/5/22 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7.2.3 使用RenderTargetBitmap类生成图片 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

RenderTargetBitmap類可以將可視化對象轉換為位圖,也就是說它可以將任意的UIElement以位圖的形式呈現。那么我們在實際的編程中通常會利用RenderTargetBitmap類來對UI界面進行截圖操作,比如把程序的界面或者某個控件的外觀生成一張圖片。

??? 使用RenderTargetBitmap類生成圖片一般有兩種用途,一種是直接把生成的圖片在當前的頁面上進行展示,還有一種用途是把生成的圖片當作文件存儲起來,或者通過某種分享方式把圖片文件分享出去。那么第二種用途的編程實現肯定是在第一種的編程實現的基礎上來實現的,所以我們首先看一下第一種情況的實現,如何把截圖在當前的界面上展示。

??? 使用RenderTargetBitmap類生成圖片的操作主要是依賴于RenderTargetBitmap類的RenderAsync方法。RenderAsync方法有兩個重載:RenderAsync(UIElement) 和 RenderAsync(UIElement, Int32, Int32),可在后者處指定要與源可視化樹的自然大小不同的所需圖像源尺寸,沒有設置則是按照元素的原始大小生成圖片。RenderAsync方法被設計為異步方法,因此無法保證與UI源進行精確的框架同步,但大多數情況下都足夠及時。由于 RenderTargetBitmap是ImageSource的子類,因此,可以將其用作Image元素或 ImageBrush畫筆的圖像源。

下面給出生成程序截圖的示例:通過點擊屏幕來生成當前程序界面的截圖,并把截圖用Image控件展示出來,每次的點擊都產生一個最新的截圖并進行展示。 ??? 代碼清單7-9:生成程序截圖(源代碼:第7章\Examples_7_9)

MainPage.xaml文件主要代碼 ------------------------------------------------------------------------------------------------------------------<!--注冊PointerReleased 事件用于捕獲屏幕的單擊操作,并在時間處理程序中生成圖片--><Grid x:Name="root" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" PointerReleased="Grid_PointerReleased"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,35,0,28"> <TextBlock Text="我的應用程序" FontSize="20" /> <TextBlock Text="點擊截屏" FontSize="60" /> </StackPanel> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" > <!--該圖片控件用于展示截圖圖片效果--> <Image x:Name="img" /> </Grid> </Grid> MainPage.xaml.cs文件主要代碼 ------------------------------------------------------------------------------------------------------------------// 指針釋放的事件處理程序private async void Grid_PointerReleased(object sender, PointerRoutedEventArgs e) { // 創建一個RenderTargetBitmap對象,對界面中的Grid控件root生成圖片 RenderTargetBitmap bitmap = new RenderTargetBitmap(); await bitmap.RenderAsync(root); // 把圖片展現出來 img.Source = bitmap; }

7.2.4 存儲生成的圖片文件

??? 在上文我們講解了如何把程序界面截圖出來放到Image控件上展示,那么我們接下來將繼續介紹如何把截圖出來的圖片保存到程序存儲里面。在我們調用RenderAsync方法的時候會初始化RenderTargetBitmap類的對象,但是RenderTargetBitmap類的對象本身并不能作為圖片來進行存儲,要生成圖片文件需要獲取到圖片的二進制數據。如果你想要獲取 DataTransferManager 操作(例如共享協定交換)的圖像,或想要使用 Windows.Graphics.Imaging API 將效果應用到圖像上或對圖像進行轉碼,那么就需要用到像素數據。如果你想訪問RenderTargetBitmap的Pixels數據,你需要在用RenderAsync這個方法將UIElement定義為 RenderTargetBitmap后,再調用RenderTargetBitmap的GetPixelsAsync方法來獲得其Pixels數據。該方法返回的是一個IBuffer類型,里面存儲的是二進制的位圖數。這個IBuffer可以轉換為一個Byte數組,數組里面的數據是以BGRA8格式存儲的。

??? 以下代碼示例如何從一個RenderTargetBitmap對象中獲得以byte數組類型存儲的像素數。需要特別注意的是IBuffer實例調用的ToArray方法是一個擴展方法,你需要在你的項目中加入System.Runtime.InteropServices.WindowsRuntime這個命名空間。

??? var bitmap = new RenderTargetBitmap();

??? await bitmap.RenderAsync(elementToRender);

?? ?IBuffer pixelBuffer = await bitmap.GetPixelsAsync();

?? ?byte[] pixels = pixelBuffer.ToArray();

??? 那么在獲取到了圖像的二進制數據之后,如果要把二進制的數據生成圖片文件,需要使用到BitmapEncoder類。BitmapEncoder類包含創建、編輯和保存圖像的各種方法。創建圖片文件首先需要調用BitmapEncoder類CreateAsync方法,來使用文件的流來創建一個BitmapEncoder對象,然后再使用BitmapEncoder類的SetPixelData設置圖像有關幀的像素數據。SetPixelData的方法參數如下:

??? SetPixelData(BitmapPixelFormat pixelFormat, BitmapAlphaMode alphaMode, uint width, uint height, double dpiX, double dpiY, byte[] pixels)

??? 其中,pixelFormat表示像素數據的像素格式;alphaMode表示像素數據的alpha模式;width表示像素數據的寬度(以像素為單位);height表示像素數據的高度(以像素為單位);dpiX表示像素數據的水平分辨率(以每英寸點數為單位);dpiY表示像素數據的垂直分辨率(以每英寸點數為單位);pixels表示像素數據。此方法是同步的,因為直到調用 FlushAsync、GoToNextFrameAsync 或 GoToNextFrameAsync(IIterable(IKeyValuePair)) 才會提交數據。此方法將所有像素數據視為sRGB 顏色空間中的像素數據。

下面給出保存截圖文件的示例:先使用RenderTargetBitmap類生成程序界面的截圖,然后再將截圖的二進制數據生成圖片文件存儲到程序存儲中。 ??? 代碼清單7-10保存截圖文件(源代碼:第7章\Examples_7_10)

MainPage.xaml文件主要代碼 ------------------------------------------------------------------------------------------------------------------<Grid x:Name="root" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> ……省略若干代碼 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <StackPanel> <Button x:Name="bt_save" Content="存儲生成的圖片" Click="bt_save_Click"></Button> <Button x:Name="bt_show" Content="展示存儲的圖片" Click="bt_show_Click"></Button> <ScrollViewer BorderBrush="Red" BorderThickness="2" Height="350"> <Image x:Name="img" /> </ScrollViewer> </StackPanel> </Grid> </Grid> MainPage.xaml.cs文件主要代碼 ------------------------------------------------------------------------------------------------------------------// 按鈕事件生成圖片并保存到程序的存儲里面private async void bt_save_Click(object sender, RoutedEventArgs e) { // 生成RenderTargetBitmap對象 RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(); await renderTargetBitmap.RenderAsync(root); // 獲取圖像的二進制數據 var pixelBuffer = await renderTargetBitmap.GetPixelsAsync(); // 創建程序文件存儲 IStorageFolder applicationFolder = ApplicationData.Current.LocalFolder; IStorageFile saveFile = await applicationFolder.CreateFileAsync("snapshot.png", CreationCollisionOption.OpenIfExists); // 把圖片的二進制數據寫入文件存儲 using (var fileStream = await saveFile.OpenAsync(FileAccessMode.ReadWrite)) { var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, fileStream); encoder.SetPixelData( BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)renderTargetBitmap.PixelWidth, (uint)renderTargetBitmap.PixelHeight, DisplayInformation.GetForCurrentView().LogicalDpi, DisplayInformation.GetForCurrentView().LogicalDpi, pixelBuffer.ToArray()); await encoder.FlushAsync(); } } // 展示程序存儲圖片的按鈕事件 private void bt_show_Click(object sender, RoutedEventArgs e) { // “ms-appdata:///local”表示是程序存儲的根目錄 BitmapImage bitmapImage = new BitmapImage(new Uri("ms-appdata:///local/snapshot.png", UriKind.Absolute)); img.Source = bitmapImage; }

轉載于:https://www.cnblogs.com/LY-Byfalt/p/4859224.html

總結

以上是生活随笔為你收集整理的7.2.3 使用RenderTargetBitmap类生成图片的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天色天天色 | 男女黄床上色视频免费的软件 | 久久久1 | 中文字幕第3页 | 黄91在线观看 | 欧美激情久久久久久久 | av电影在线观看不卡 | 欧美国产在线看 | 国产女人视频 | 不卡在线一区二区 | 国产精品亚洲自拍 | 影音先锋在线国产 | 天堂网在线播放 | 日韩精品h | 无码人妻精品一区二区蜜桃色欲 | 婷婷综合视频 | 久久久久久国产精品三级玉女聊斋 | 男人添女人荫蒂国产 | 四色永久访问 | 国产一区二区三区黄 | 精精国产xxxx视频在线播放 | 欧美区一区 | 亚洲精品一区二区三区蜜桃 | 特级丰满少妇一级aaa爱毛片 | 你懂的网站在线 | 日韩欧美一卡 | 欧美亚洲天堂 | 亚洲精品福利在线 | 涩色网 | 日韩av不卡在线 | av中出| 97超碰在线免费观看 | 国产一二在线 | 男男做爰猛烈叫床爽爽小说 | 超碰在线免费观看97 | av在线三区 | 多啪啪免费视频 | 中文字幕乱码人妻无码久久 | 日韩黄色片免费看 | 午夜激情在线 | 麻豆亚洲精品 | 一区二区三区高清 | 光明影院手机版在线观看免费 | 成人欧美精品 | 鬼眼 | 成人亚洲精品久久久久软件 | 国产精品无码专区av在线播放 | 欧美日韩在线高清 | 蝌蚪av| 亚洲欧美成人网 | 伊人操 | 亚洲免费网站在线观看 | 国产在线播放一区二区 | 国产v片在线观看 | 国产精品免费精品一区 | 美女毛片在线观看 | 色激情网 | 一吻定情2013日剧 | 欧美真人性野外做爰 | 国产色无码精品视频 | 女人17片毛片60分钟 | 成人国产精品蜜柚视频 | 欧美精品久久久久久久久久 | 中文字幕在线2019 | 草草在线视频 | 欧美人与性动交a欧美精品 日韩免费高清视频 | www.久热| 欧产日产国产精品 | 制服丝袜在线播放 | 国产区精品在线 | 人妻少妇被粗大爽9797pw | 懂色一区二区三区免费观看 | 性少妇videosexfre | 99久久久无码国产精品6 | 国产成人短视频在线观看 | 97精品人妻一区二区三区 | 成人免费视频国产在线观看 | 蜜桃视频成人 | 在线观看一区视频 | 中文字幕亚洲欧美日韩 | 中文在线www | 91精品国产自产在线观看 | 国产一区二区三区影院 | 一本—道久久a久久精品蜜桃 | 黄a在线 | 免费欧美大片 | 午夜va | 欧美xxxxx高潮喷水麻豆 | 欧美人与性动交α欧美片 | 日韩专区一区 | 日本亚洲一区二区 | 久草视频手机在线观看 | 日本深夜福利 | 色呦呦在线播放 | 日本打白嫩屁股视频 | 91激情 | av视| 中文字幕精品一区 | 97在线播放免费观看 |