[源码下载]

重新想象 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
[源码下载]

重新想象 Windows 8.1 Store Apps (84) - 图像处理的新特性, Share Contract 的新特性的更多相关文章

  1. 重新想象 Windows 8.1 Store Apps (85) - 警报通知(闹钟), Tile 的新特性

    [源码下载] 重新想象 Windows 8.1 Store Apps (85) - 警报通知(闹钟), Tile 的新特性 作者:webabcd 介绍重新想象 Windows 8.1 Store Ap ...

  2. 重新想象 Windows 8.1 Store Apps 系列文章索引

    [源码下载] [重新想象 Windows 8 Store Apps 系列文章] 重新想象 Windows 8.1 Store Apps 系列文章索引 作者:webabcd 1.重新想象 Windows ...

  3. 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Contract 分享 WebView 中的内容, 为 WebView 截图

    [源码下载] 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Co ...

  4. 重新想象 Windows 8.1 Store Apps (72) - 新增控件: AppBar, CommandBar

    [源码下载] 重新想象 Windows 8.1 Store Apps (72) - 新增控件: AppBar, CommandBar 作者:webabcd 介绍重新想象 Windows 8.1 Sto ...

  5. 重新想象 Windows 8.1 Store Apps (73) - 新增控件: DatePicker, TimePicker

    [源码下载] 重新想象 Windows 8.1 Store Apps (73) - 新增控件: DatePicker, TimePicker 作者:webabcd 介绍重新想象 Windows 8.1 ...

  6. 重新想象 Windows 8.1 Store Apps (74) - 新增控件: Flyout, MenuFlyout, SettingsFlyout

    [源码下载] 重新想象 Windows 8.1 Store Apps (74) - 新增控件: Flyout, MenuFlyout, SettingsFlyout 作者:webabcd 介绍重新想象 ...

  7. 重新想象 Windows 8.1 Store Apps (75) - 新增控件: Hub, Hyperlink

    [源码下载] 重新想象 Windows 8.1 Store Apps (75) - 新增控件: Hub, Hyperlink 作者:webabcd 介绍重新想象 Windows 8.1 Store A ...

  8. 重新想象 Windows 8.1 Store Apps (76) - 新增控件: SearchBox

    [源码下载] 重新想象 Windows 8.1 Store Apps (76) - 新增控件: SearchBox 作者:webabcd 介绍重新想象 Windows 8.1 Store Apps 之 ...

  9. 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件增加了 PlaceholderText 属性

    [源码下载] 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件 ...

随机推荐

  1. ubuntu 12 JDK 编译

    下载openjdk源码 http://jdk7.java.net/source.html 安装Ubuntu上面的依赖包: .参考原书 环境变量配置: .去www.hzbook.com上面将深入理解ja ...

  2. 查看SqlAzure和SQLServer中的每个表数据行数

    SqlAzure中的方式: select t.name ,s.row_count from sys.tables t join sys.dm_db_partition_stats s ON t.obj ...

  3. 【C#|.NET】lock(this)其实是个坑

    这里不考虑分布式或者多台负载均衡的情况只考虑单台机器,多台服务器可以使用分布式锁.出于线程安全的原因,很多种场景大家可能看代码中看到lock的出现,尤其是在资金类的处理环节. 但是lock(this) ...

  4. AngularJS初始化闪烁

    可以使用:ng-if和ng-cloak解决,原因见:http://www.cnblogs.com/whitewolf/p/3495822.html

  5. Openvswitch原理与代码分析(6):用户态流表flow table的操作

    当内核无法查找到流表项的时候,则会通过upcall来调用用户态ovs-vswtichd中的flow table. 会调用ofproto-dpif-upcall.c中的udpif_upcall_hand ...

  6. js后退一直停留在当前页面或者禁止后退

    //禁用后退按钮 function stopHistoryGo() { //禁用回退 window.location.hash="no-back-button"; window.l ...

  7. 带着问题学 Spring MVC 源码: 一、概述

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! 简单就好,生活可以很德国 Q:什么是 Spring MVC ? ※ Spring MVC 是 S ...

  8. Linux多线程编程(不限Linux)【转】

    ——本文一个例子展开,介绍Linux下面线程的操作.多线程的同步和互斥. 前言 线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步 ...

  9. 哈夫曼算法(haffman)实现压缩和解压缩-C语言实现

    /* * ===================================================================================== * * Filen ...

  10. Auto CAD 2013的故障解决方法

    一.问题的提出 Auto CAD 2013在使用过程中出现了错误:“安全系统(软件锁许可管理器) 不起作用或未正确安装.” 二.问题的分析 网络上很多地方转载了这么一个方法: 1) 启动Windows ...