[深入浅出WP8.1(Runtime)]应用实例——移动截图

10.2应用实例——移动截图

移动截图例子是实现一个把一张图片的某个部分截取出来的功能,并且用户可以选定截取的图片区间。那个该例子会使用ManipulationDelta事件来实现对截取区间的选择。然后使用UIElement元素的Clip属性对图片进行局部截取。

下面给出移动截图的示例:该示例主要有3个主要的逻辑分别是截图区域的选择、图片的局部截取和截图的展示。

代码清单10-3移动截图(源代码:第10章\Examples_10_3)

MainPage.xaml文件主要代码:在UI上image1是图片的展示,image2是显示截取之后的图片,命名为LayoutRoot的Grid控件则是图片和截图区域的容器。
------------------------------------------------------------------------------------------------------------------
    <ScrollViewer>
        <StackPanel>
            <Grid x:Name="LayoutRoot">
                <Image Source="/test.jpg"  Height="460" Width="300"  Name="image1"/>
            </Grid>
            <Button Content="剪切" x:Name="button"></Button>
            <Image  Name="image2" />
        </StackPanel>
    </ScrollViewer>

10.2.1 截图区域的选择

截图区域的选择是指要动画手指滑动的方式来控制截图的位置和大小,那么在该例子里面实现的逻辑是以照片的中心为截图区域的中心,然后用户可以通过滑动来改变这个截图矩形的宽度和高度。那么我们实现的思路是,先要在图片上面添加一个矩形控件Rectangle,然后给这个Rectangle控件添加上ManipulationDelta事件,监控用户在截图矩形上面的滑动情况,在ManipulationDelta事件的处理程序上调整Rectangle控件的大小。代码如下所示:

MainPage.xaml.cs文件部分代码:截图区域的选择。
------------------------------------------------------------------------------------------------------------------
    public MainPage()
    {
        this.InitializeComponent();
        button.Click += button_Click;
        // 设置图片上方的截图区域
        SetPicture();
    }
    // 添加图片的截图区域
    void SetPicture()
    {
        // 创建一个Rectangle控件
        Rectangle rect = new Rectangle();
        rect.Opacity = 0.5;
        rect.Fill = new SolidColorBrush(Colors.White);
        rect.Height = image1.Height;
        rect.Width = image1.Width;
        rect.Stroke = new SolidColorBrush(Colors.Red);
        rect.StrokeThickness = 2;
        rect.Margin = image1.Margin;
        // 添加触摸滑动过程的事件监控
        rect.ManipulationMode = ManipulationModes.All;
        rect.ManipulationDelta += rect_ManipulationDelta;
        // 把Rectangle控件添加到LayoutRoot上,这时候该控件会出现在图片的上方
        LayoutRoot.Children.Add(rect);
        LayoutRoot.Height = image1.Height;
        LayoutRoot.Width = image1.Width;
    }
    // 利用手指滑动来改变截图框的位置和大小
    void rect_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        // 获取事件的发送方,也就是截图区域Rectangle控件
        Rectangle croppingRectangle = (Rectangle)sender;
        // 通过手指的位移来更改Rectangle控件的宽度和高度
        // 往右滑动宽度减少(X为正),往左滑动宽度增加(X为负)
        if (croppingRectangle.Width >= (int)e.Delta.Translation.X)
            croppingRectangle.Width -= (int)e.Delta.Translation.X;
        // 往下滑动高度减少(X为正),往上滑动高度增加(X为负)
        if (croppingRectangle.Height >= (int)e.Delta.Translation.Y)
            croppingRectangle.Height -= (int)e.Delta.Translation.Y;
    }

10.2.2 图片的局部截取

在截图区域已经定位好之后,接下来的这一步就是需要根据截图区域的位置来把图片截取出来,那么在这一步里面最主要的逻辑是把Rectangle控件的位置大小信息转化为image1图片里面的相对位置的区域信息,然后再通过Clip属性来进行截取。代码如下所示:

MainPage.xaml.cs文件部分代码:图片的局部截取。
------------------------------------------------------------------------------------------------------------------
    // 截取图片的区域
    void ClipImage()
    {
        // 创建一个矩形的几何图形,用于赋值给Clip属性,注意:做为属性使用的几何图形必须是*Geometry类型的图形
        RectangleGeometry geo = new RectangleGeometry();
        // 获取截图的矩形控件,通过Grid容器向下查找
        Rectangle r = (Rectangle)(from c in LayoutRoot.Children where c.Opacity == 0.5 select c).First();
        // 把截图的矩形控件的位置信息转换成为相对于Grid容器的位置信息
        GeneralTransform gt = r.TransformToVisual(LayoutRoot);
        // 获取截图区域左上角的坐标,意思是原来r的左上角坐标(0, 0)在LayoutRoot上的坐标的转换
        Point p = gt.TransformPoint(new Point(0, 0));
        // 创建相对于LayoutRoot上的截图区域
        geo.Rect = new Rect(p.X, p.Y, r.Width, r.Height);
        image1.Clip = geo;
        // 把截图控件隐藏起来
        r.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
    }

10.2.3 截图的展示

截图展示是指把最终截取的图片展示出来,通过Clip属性把图片截取出来之后,实际上并不是把图片给剪切了,它仅仅只是把其他区域的部分给挡住了而已,那么要把真是的截图区域获取出来,可以使用RenderTargetBitmap类来实现。RenderTargetBitmap类可以把将 UI元素对象转换为位图。代码如下所示:

MainPage.xaml.cs文件部分代码:截图的展示。
------------------------------------------------------------------------------------------------------------------
    //剪切按钮事件
    async void button_Click(object sender, RoutedEventArgs e)
    {
        // 调用ClipImage方法,实现图片的局部截取
        ClipImage();
        // 创建一个RenderTargetBitmap对象,并调用RenderAsync方法把UI元素LayoutRoot转化成为RenderTargetBitmap对象
        var bitmap = new RenderTargetBitmap();
        await bitmap.RenderAsync(LayoutRoot);
        // 由于RenderTargetBitmap类本来就是从ImageSource类派生的,所以可以直接复制给图片控件进行显示
        image2.Source = bitmap;
    }

本文来源于《深入浅出Windows Phone 8.1 应用开发》

WP8.1 Runtime文章列表:http://www.cnblogs.com/linzheng/p/3998037.html

源代码下载:http://vdisk.weibo.com/s/zt_pyrfNHb99O

欢迎关注我的微博@WP林政   微信公众号:wp开发(号:wpkaifa)

WP8.1技术交流群:372552293

时间: 2024-10-20 07:52:31

[深入浅出WP8.1(Runtime)]应用实例——移动截图的相关文章

[深入浅出WP8.1(Runtime)]数据绑定的基础

11.1 数据绑定的基础 数据绑定是一种XAML界面和后台数据通信的方式,因为界面和后台数据的通信的场景有多种,并且数据于数据之间也存在着不一样的关联关系,所以数据绑定的实现技巧和方式也是多种多样的.下面我们全面地介绍数据绑定的实现原理和相关的语法基础. 11.1.1 数据绑定的原理 数据绑定主要包含两大模块,一是绑定目标,也就是UI界面这块,另一模块是绑定源,也就是给数据绑定提供数据的后台代码.然后这两大模块通过某种方式和语法关联起来,会互相影响或者只是一边对另一边产生影响,这就是数据绑定的基

[深入浅出WP8.1(Runtime)]网络编程之HttpClient类

12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类提供了一个简单的接口来处理最常见的任务,并为身份验证提供了适用于大多数方案的合理的默认设置.对于较为复杂的 HTTP 操作,更多的功能包括:执行常见操作(DELETE.GET.PUT 和 POST)的方法:获取.设置和删除 Cookie 的功能:支持常见的身份验证设置和模式:异步方法上提供的 HTT

[深入浅出WP8.1(Runtime)]Socket编程之UDP协议

13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只传送少量数据.对可靠性要求不高的应用环境.既然 UDP 是一种不可靠的网络协议,那么还有什么使用价值或必要呢?其实不然,在有些情况下UDP协议可能会变得非常有用.因为UDP具有TCP所望尘莫及的速度优势.虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受

[深入浅出WP8.1(Runtime)]生成图片和存储生成的图片文件

7.2.3 使用RenderTargetBitmap类生成图片 RenderTargetBitmap类可以将可视化对象转换为位图,也就是说它可以将任意的UIElement以位图的形式呈现.那么我们在实际的编程中通常会利用RenderTargetBitmap类来对UI界面进行截图操作,比如把程序的界面或者某个控件的外观生成一张图片. 使用RenderTargetBitmap类生成图片一般有两种用途,一种是直接把生成的图片在当前的页面上进行展示,还有一种用途是把生成的图片当作文件存储起来,或者通过某

[深入浅出WP8.1(Runtime)]应用文件的URI方案

6.2.4 应用文件的URI方案 在上文我们获取文件的方式都是通过应用程序的三个跟目录的文件夹对象来获取文件夹对象和文件对象,那么我们这一小节来讲解一种新的获取文件对象的方式,这种方式就是通过Uri地址来获取.应用程序存储里面的文件夹和文件其实和我们平时在Windows电脑上看到的文件的目录是一样的,只不过它们是在存储里面,你并不能很直观地看到他们的路径,当然我们还是可以通过StorageFile类的Path属性来查看到文件的保存路径,例如我们查看一个在LocalFolder文件夹的testfi

[深入浅出WP8.1(Runtime)]Windows Phone 8.1和Silverlight 8.1的区别

1.2.2 Windows Phone 8.1应用程序模型 Windows Phone 8.1支持多种开发语言来开发应用程序,包括C#.VB.JavaScript和C++,那么本书的代码主要是采用C#语言来开发,部分章节采用C++.从Windows  Phone 8.1开始,如果是开发普通的应用程序可以选择的应用程序模型有:C#/XAML.VB/XAML.C++/XAML和JavaScript /HTML5.游戏开发还是采用C++的DirectX的框架.在Windows Phone 8之前如果是

[深入浅出WP8.1(Runtime)]文本块(TextBlock)

4.3 文本块(TextBlock) 文本块(TextBlock)控件是用于显示少量文本的轻量控件,可以通过TextBlock呈现只读的文本,你可以把TextBlock控件理解为一种纯文本的展示控件.控件的XAML语法如下: <TextBlock .../> 或者 <TextBlock ...>内容</TextBlock> TextBlock在Windows Phone应用中非常普遍,它就相当于一个只是用于呈现文本的标签一样.写过HTML页面的开发者都知道,在HTML语

[深入浅出WP8.1(Runtime)]浮出控件(Flyout)

4.15 浮出控件(Flyout) 浮出控件(Flyout)是一个轻型的辅助型的弹出控件,通常会作为提示或者要求用户进行相关的交互来使用.Flyout控件与Windows Phone里面的弹出框MessageDialog是有很大区别的,首先Flyout控件是一个辅助控件,需要与其他控件结合起来才能使用,还有就是取消的规则不一样,Flyout控件可以通过单击或在外部点击都可以轻松消除浮出控件.你可以使用Flyout控件收集用户输入.显示与某个项目相关的更多信息或者要求用户确认某个操作.只有当为了响

关于wp8.1 runtime模式下面的摄像头调用拍照问题和应用生命周期问题

现在的msdn文档,还找不到详细的wp8.1的摄像头拍照文档,只有一个序列拍照,类似九连拍的文档,而且这文档感觉就是windows8.1搬过来应付的,wp8.1模式,只要有一个地方处理不好,手机就会死机,只能拆电池重启了,做开发现在是想砸电脑的感觉,我昨天拆了接近三十次电池,你知道820手机的后壳多难拆么,不装后盖,很容易掉电池出来. wp8.1,调用摄像头的API改成用 mediacpature了,然后通过判断可以在初始化函数里面压入需要调用的摄像头数据,这个初始化,不知道是什么原因,在模拟器