重新想象 Windows 8.1 Store Apps (84) - 圖像處理的新特性, Share Contract 的新特性
作者:webabcd
介紹
重新想象 Windows 8.1 Store Apps 之圖像處理的新特性, Share Contract 的新特性
- 圖像處理的新特性 - 通過 RenderTargetBitmap 對 xaml 截圖,以及保存圖片
- Share Contract 的新特性 - 增加 WebLink, ApplicationLink, 去掉了 Uri, “共享目標”可以自己 dismiss
示例
1、演示圖像處理的新特性
RenderTargetBitmapDemo.xaml
<Page x:Class="Windows81.Image.RenderTargetBitmapDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows81.Image" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Transparent"> <StackPanel Margin="120 0 0 0"> <StackPanel Width="200" Name="root" HorizontalAlignment="Left"> <TextBlock Name="lblMsg" FontSize="14.667" Text="i am webabcd" /> <Slider Width="200" /> <Image Source="/Assets/Son.jpg" /> </StackPanel> <Button Name="btnSaveImage" Content="將控件 root 中的內容保存為圖片" Click="btnSaveImage_Click" Margin="0 10 0 0" /> <Image Name="image" Margin="0 10 0 0" Stretch="None" HorizontalAlignment="Left" /> </StackPanel> </Grid> </Page>
RenderTargetBitmapDemo.xaml.cs
/* * 演示如何通過 RenderTargetBitmap 對 xaml 截圖,以及如何將其保存為圖片 * * * RenderTargetBitmap - 用於對 xaml 截圖,以及保存截圖(其繼承自 ImageSource) * PixelWidth, PixelWidth - 寬和高 * RenderAsync() - 對指定的 UIElement 截圖 * GetPixelsAsync() - 獲取圖像的二進制數據(Bgra8 格式,關於 Bgra8 格式請參見:http://www.cnblogs.com/webabcd/archive/2013/05/27/3101069.html) * * * * 關於更多的圖像處理基礎,以及 WriteableBitmap 的應用請參見: * http://www.cnblogs.com/webabcd/archive/2013/05/27/3101069.html */ using System; using System.Collections.Generic; using System.Runtime.InteropServices.WindowsRuntime; using Windows.Graphics.Display; using Windows.Graphics.Imaging; using Windows.Storage; using Windows.Storage.Pickers; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media.Imaging; namespace Windows81.Image { public sealed partial class RenderTargetBitmapDemo : Page { public RenderTargetBitmapDemo() { this.InitializeComponent(); } private async void btnSaveImage_Click(object sender, RoutedEventArgs e) { // 實例化 RenderTargetBitmap 並對指定的 UIElement 截圖,同時指定截圖的寬和高 RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(); await renderTargetBitmap.RenderAsync(root, (int)root.ActualWidth, (int)root.ActualHeight); // 由於 RenderTargetBitmap 繼承自 ImageSource,所以可以直接顯示(WriteableBitmap 也繼承了 ImageSource) image.Source = renderTargetBitmap; // 獲取截圖的像素數據 var pixelBuffer = await renderTargetBitmap.GetPixelsAsync(); // 實例化一個 FileSavePicker 用於保存圖片 var savePicker = new FileSavePicker(); savePicker.DefaultFileExtension = ".png"; savePicker.FileTypeChoices.Add(".png", new List<string> { ".png" }); savePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; savePicker.SuggestedFileName = "snapshot.png"; var saveFile = await savePicker.PickSaveFileAsync(); if (saveFile == null) return; // 對二進制圖像數據做 png 編碼處理(關於更多的圖像處理的示例請參見:http://www.cnblogs.com/webabcd/archive/2013/05/27/3101069.html) 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()); // 保存 png 圖片 await encoder.FlushAsync(); } } } }
2、演示 Share Contract 的新特性
共享源:
ShareSource.xaml
<Page x:Class="Windows81.ShareContract.ShareSource" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows81.ShareContract" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Transparent"> <StackPanel Margin="120 0 0 0"> <TextBlock Name="lblMsg" FontSize="14.667" /> <Button Content="Share WebLink" Click="Button_Click" Margin="0 10 0 0" /> <Button Content="Share ApplicationLink" Click="Button_Click" Margin="0 10 0 0" /> </StackPanel> </Grid> </Page>
ShareSource.xaml.cs
/* * 演示 Share Contract 的新特性(增加 WebLink, ApplicationLink, 去掉了 Uri, “共享目標”可以自己 dismiss) * * * 本例為“共享源” * * * 注:關於 Share Contract 的基礎請參見:http://www.cnblogs.com/webabcd/archive/2013/07/04/3171085.html */ using System; using Windows.ApplicationModel.DataTransfer; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace Windows81.ShareContract { public sealed partial class ShareSource : Page { // 當前需要分享的內容的類型 private string _shareType = "Share WebLink"; public ShareSource() { this.InitializeComponent(); } protected override void OnNavigatedTo(NavigationEventArgs e) { // 初始化 DataTransferManager DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView(); dataTransferManager.DataRequested += dataTransferManager_DataRequested; dataTransferManager.TargetApplicationChosen += dataTransferManager_TargetApplicationChosen; } void dataTransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) { // 共享操作開始時(即彈出共享面板后),根據需要分享的內容的類型執行指定的方法 switch (_shareType) { case "Share WebLink": // win 8.1 新增(一個 web 鏈接),去掉了原 Uri 共享(即在 win8.1 中將 Uri 拆分為 WebLink 和 ApplicationLink) ShareWebLink(sender, args); break; case "Share ApplicationLink": // win 8.1 新增(一個 app 的自定義協議),去掉了原 Uri 共享(即在 win8.1 中將 Uri 拆分為 WebLink 和 ApplicationLink) ShareApplicationLink(sender, args); break; default: break; } } void dataTransferManager_TargetApplicationChosen(DataTransferManager sender, TargetApplicationChosenEventArgs args) { // 顯示用戶需要與其共享內容的應用程序的名稱 lblMsg.Text = "共享給:" + args.ApplicationName; } private void Button_Click(object sender, RoutedEventArgs e) { _shareType = (sender as Button).Content.ToString(); // 彈出共享面板,以開始共享操作 DataTransferManager.ShowShareUI(); } // 共享 WebLink 的 Demo private void ShareWebLink(DataTransferManager dtm, DataRequestedEventArgs args) { // 設置用於共享給“共享目標”的一些信息 DataPackage dataPackage = args.Request.Data; dataPackage.Properties.Title = "Title"; dataPackage.Properties.Description = "Description"; // dataPackage.Properties.ApplicationListingUri - app 在商店中的 uri // dataPackage.Properties.ApplicationName // dataPackage.Properties.PackageFamilyName - win8.1 新增 // dataPackage.Properties.LogoBackgroundColor - win8.1 新增,app 的 Square30x30Logo 圖標的背景色(圖標在“共享目標”的右上角顯示) // dataPackage.Properties.ContentSourceWebLink - win8.1 新增 // dataPackage.Properties.ContentSourceApplicationLink - win8.1 新增 dataPackage.SetWebLink(new Uri("http://webabcd.cnblogs.com")); } // 共享 ApplicationLink 的 Demo private void ShareApplicationLink(DataTransferManager dtm, DataRequestedEventArgs args) { // 設置用於共享給“共享目標”的一些信息 DataPackage dataPackage = args.Request.Data; dataPackage.Properties.Title = "Title"; dataPackage.Properties.Description = "Description"; // dataPackage.Properties.ApplicationListingUri - app 在商店中的 uri // dataPackage.Properties.ApplicationName // dataPackage.Properties.PackageFamilyName - win8.1 新增 // dataPackage.Properties.LogoBackgroundColor - win8.1 新增,app 的 Square30x30Logo 圖標的背景色(圖標在“共享目標”的右上角顯示) // dataPackage.Properties.ContentSourceWebLink - win8.1 新增 // dataPackage.Properties.ContentSourceApplicationLink - win8.1 新增 dataPackage.SetApplicationLink(new Uri("webabcd:webabcd.cnblogs.com")); } } }
共享目標:
ShareTarget.xaml
<Page x:Class="Windows81.ShareContract.ShareTarget" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows81.ShareContract" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Transparent"> <StackPanel Margin="120 0 0 0"> <TextBlock Name="lblMsg" FontSize="14.667" Margin="0 10 0 0" /> <Button Name="btnDismiss" Content="dismiss" Click="btnDismiss_Click" Margin="0 10 0 0" /> </StackPanel> </Grid> </Page>
ShareTarget.xaml.cs
/* * 演示 Share Contract 的新特性(增加 WebLink, ApplicationLink, 去掉了 Uri, “共享目標”可以自己 dismiss) * * * 本例為“共享目標” * 1、請在 manifest 中增加相應的聲明,並增加共享“WebLink”和“ApplicationLink”的數據格式 * * * 注:關於 Share Contract 的基礎請參見:http://www.cnblogs.com/webabcd/archive/2013/07/04/3171085.html */ using System; using System.Threading.Tasks; using Windows.ApplicationModel.Activation; using Windows.ApplicationModel.DataTransfer; using Windows.ApplicationModel.DataTransfer.ShareTarget; using Windows.UI.Core; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace Windows81.ShareContract { public sealed partial class ShareTarget : Page { private ShareOperation _shareOperation; public ShareTarget() { this.InitializeComponent(); } protected async override void OnNavigatedTo(NavigationEventArgs e) { // 獲取 ShareOperation 對象 ShareTargetActivatedEventArgs shareTargetActivated = (ShareTargetActivatedEventArgs)e.Parameter; if (shareTargetActivated == null) { lblMsg.Text = "為了演示共享目標,請從共享源激活本頁面"; return; } _shareOperation = shareTargetActivated.ShareOperation; // 異步獲取共享數據 await Task.Factory.StartNew(async () => { // 如果共享數據中包含 WebLink 格式數據,則顯示之 if (_shareOperation.Data.Contains(StandardDataFormats.WebLink)) { try { var uri = await _shareOperation.Data.GetWebLinkAsync(); OutputMessage("WebLink: " + uri.AbsoluteUri); } catch (Exception ex) { OutputMessage(ex.ToString()); } } // 如果共享數據中包含 ApplicationLink 格式數據,則顯示之 if (_shareOperation.Data.Contains(StandardDataFormats.ApplicationLink)) { try { var uri = await _shareOperation.Data.GetApplicationLinkAsync(); OutputMessage("ApplicationLink: " + uri.AbsoluteUri); } catch (Exception ex) { OutputMessage(ex.ToString()); } } // 獲取“共享源”傳遞過來的信息 OutputMessage("ContentSourceApplicationLink: " + _shareOperation.Data.Properties.ContentSourceApplicationLink); // win 8.1 新增 OutputMessage("ContentSourceWebLink: " + _shareOperation.Data.Properties.ContentSourceWebLink); // win 8.1 新增 OutputMessage("PackageFamilyName: " + _shareOperation.Data.Properties.PackageFamilyName); // win 8.1 新增 OutputMessage("LogoBackgroundColor: " + _shareOperation.Data.Properties.LogoBackgroundColor); // win 8.1 新增 OutputMessage("ApplicationListingUri: " + _shareOperation.Data.Properties.ApplicationListingUri); OutputMessage("ApplicationName: " + _shareOperation.Data.Properties.ApplicationName); }); } // 在 UI 上輸出指定的信息 async private void OutputMessage(string message) { await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { lblMsg.Text += message; lblMsg.Text += Environment.NewLine; }); } private void btnDismiss_Click(object sender, RoutedEventArgs e) { // ShareOperation.DismissUI() - win8.1 中新增,用於 dismiss 掉當前的“共享目標” _shareOperation.DismissUI(); } } } /* * 為了激活“共享目標”,需要在 App.xaml.cs 中 override 如下方法 // 通過共享激活應用程序時所調用的方法 protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args) { var rootFrame = new Frame(); rootFrame.Navigate(typeof(Windows81.ShareContract.ShareTarget), args); Window.Current.Content = rootFrame; Window.Current.Activate(); } */
OK
[源碼下載]
