使用WriteableBitmap进行截图

一、WriteableBitmap 类
提供一个可写入并可更新的 BitmapSource。 BitmapSource 是 Silverlight 图像处理管线的基本构造块,从概念上说表示具有特定大小和分辨率的单个不变的像素集。
命名空间:  System.Windows.Media.Imaging
使用 WriteableBitmap 类基于每个框架来更新和呈现位图。 这对于生成算法内容(如分形图像)和数据可视化(如音乐可视化工具)很有用。实例:点击程序屏幕不断地获取屏幕图像嵌套进去


 
 
< Grid x:Name ="ContentPanel" Grid.Row ="1" Margin ="12,0,12,0" Background =" {StaticResource PhoneAccentBrush} " > < TextBlock Text ="Tap anywhere to capture page" HorizontalAlignment ="Center" VerticalAlignment ="Center" /> < Image Name ="img" Stretch ="Fill" /> </ Grid >
复制代码
复制代码
  
  
public MainPage() { InitializeComponent(); } protected override void OnManipulationStarted(ManipulationStartedEventArgs args) { img.Source = new WriteableBitmap( this , null ); // 使用element 和 transform来创建一个WriteableBitmap args.Complete(); args.Handled = true ; base .OnManipulationStarted(args); }
复制代码
public WriteableBitmap(UIElement element, Transform transform) 这个构造函数。element 是要在位图中呈现的元素;transform 是用户在绘制到位图之前最后一步应用到元素的变换。如果您希望位图将元素的变换考虑在内,则这对于您特别有意义。此值可为 null。

这个 WriteableBitmap 构造函数适用于绝大多数的"复制内容"方案。这个构造函数可生成在保留内容基础下,尽量减少空白的 PBGRA32格式(采用32BPP的一种基于sRGB的像素格式)的  WriteableBitmap。它把 element 的各种变化都考虑进去了,这些变化包括:Clip,Effect,Opacity,OpacityMask,Children。当然还有一些变化没有包含,这时候,我们可以对他的父控件进行截屏,就可以扑捉到这些没有包括的变化。另外:WriteableBitmap 不能呈现弹出式控件,如 Popup、ComboBox 和 ToolTip。

二、BitmapImage 类

Silverlight 提供一个经优化以使用可扩展应用程序标记语言 (XAML) 上载图像的专用 BitmapSource。 
命名空间:  System.Windows.Media.Imaging
XAML <BitmapImage .../>
BitmapImage 主要支持可扩展应用程序标记语言 (XAML) 语法,并为尚未由 BitmapSource 定义的位图加载引入附加属性。

BitmapImage 实现 ISupportInitialize 接口,以对多个属性的初始化进行优化。 只能在对象初始化过程中进行属性更改。 调用 BeginInit 以表示初始化开始;调用 EndInit 以表示初始化结束。 初始化后,将忽略属性更改。

使用 BitmapImage 构造函数创建的 BitmapImage 对象将自动初始化,且将忽略对属性的更改。

示例

实例:分裂图片--通过选择器选择一张照片放进BitmapImage里面然后利用WriteableBitmap将图片分成4块

复制代码
  
  
< Grid x:Name ="ContentPanel" Grid.Row ="1" Margin ="12,0,12,0" > < TextBlock Name ="txtblk" Text ="Touch to choose image" HorizontalAlignment ="Center" VerticalAlignment ="Center" /> < Grid HorizontalAlignment ="Center" VerticalAlignment ="Center" > < Grid.RowDefinitions > < RowDefinition Height ="*" /> < RowDefinition Height ="*" /> </ Grid.RowDefinitions > < Grid.ColumnDefinitions > < ColumnDefinition Width ="*" /> < ColumnDefinition Width ="*" /> </ Grid.ColumnDefinitions > < Image Name ="imgUL" Grid.Row ="0" Grid.Column ="0" Margin ="2" /> < Image Name ="imgUR" Grid.Row ="0" Grid.Column ="1" Margin ="2" /> < Image Name ="imgLL" Grid.Row ="1" Grid.Column ="0" Margin ="2" /> < Image Name ="imgLR" Grid.Row ="1" Grid.Column ="1" Margin ="2" /> </ Grid > </ Grid >
复制代码
复制代码
  
  
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using Microsoft.Phone.Controls; using Microsoft.Phone.Tasks; namespace SubdivideBitmap { public partial class MainPage : PhoneApplicationPage { PhotoChooserTask photoChooser = new PhotoChooserTask(); // 创建一个相片选择器 用来选择一张图片 public MainPage() { InitializeComponent(); photoChooser.Completed += OnPhotoChooserCompleted; // 添加选择器的完成事件 } // 点击程序屏幕选择图片 protected override void OnManipulationStarted(ManipulationStartedEventArgs args) { int dimension = ( int )Math.Min(ContentPanel.ActualWidth, ContentPanel.ActualHeight) - 8 ; // 设置选择图片的宽度高度 photoChooser.PixelHeight = dimension; photoChooser.PixelWidth = dimension; photoChooser.Show(); args.Complete(); args.Handled = true ; base .OnManipulationStarted(args); } // 完成选择图片触发的事件 void OnPhotoChooserCompleted( object sender, PhotoResult args) { if (args.Error != null || args.ChosenPhoto == null ) // 没有选择图片则返回跳出该方法 return ; // 创建BitmapImage来存储选择器的图片 BitmapImage bitmapImage = new BitmapImage(); bitmapImage.SetSource(args.ChosenPhoto); Image imgBase = new Image(); imgBase.Source = bitmapImage; imgBase.Stretch = Stretch.None; // 左上部分 WriteableBitmap writeableBitmap = new WriteableBitmap(bitmapImage.PixelWidth / 2 , bitmapImage.PixelHeight / 2 ); writeableBitmap.Render(imgBase, null ); writeableBitmap.Invalidate(); imgUL.Source = writeableBitmap; // 右上部分 writeableBitmap = new WriteableBitmap(bitmapImage.PixelWidth / 2 , bitmapImage.PixelHeight / 2 ); TranslateTransform translate = new TranslateTransform(); translate.X = - bitmapImage.PixelWidth / 2 ; // 在绘制到位图中之前应用到元素的变换 writeableBitmap.Render(imgBase, translate); // 在位图中呈现元素 writeableBitmap.Invalidate(); // 请求重绘整个位图 imgUR.Source = writeableBitmap; // 左下部分 writeableBitmap = new WriteableBitmap(bitmapImage.PixelWidth / 2 , bitmapImage.PixelHeight / 2 ); translate.X = 0 ; translate.Y = - bitmapImage.PixelHeight / 2 ; writeableBitmap.Render(imgBase, translate); writeableBitmap.Invalidate(); imgLL.Source = writeableBitmap; // 右下部分 writeableBitmap = new WriteableBitmap(bitmapImage.PixelWidth / 2 , bitmapImage.PixelHeight / 2 ); translate.X = - bitmapImage.PixelWidth / 2 ; writeableBitmap.Render(imgBase, translate); writeableBitmap.Invalidate(); imgLR.Source = writeableBitmap; txtblk.Visibility = Visibility.Collapsed; // 隐藏刚开始的文本 } } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值