对于这个内容,我是在学习插入图片时遇到的问题,在Windows应用中可以直接用Image类和Bitmap直接实现裁剪功能,

在wp上就不行了,后来在MSDN论坛上找到了相关方法及示例,而示例太复杂了,

我就参考https://social.msdn.microsoft.com/Forums/zh-CN/07b06a88-607b-44d8-ae5c-801d5c8b3a27上的简单示例,

因为示例没有太多注解,我在配合自己开发的程序上进行了注解和自己的理解,方便大家;

采用了WriteableBitmap类、BitmapDecoder类,好了直接上例子:

1.源图片的大小:宽140像素,高37像素;

2.我们要裁剪出的图片大小为:宽28像素,高37像素(相当于将源图片沿直线等分5份);

3.知道上两条的要求,现在我们先创建获得裁剪图片后(宽28像素,高37像素)的像素数据的方法,代码如下:

 #region
/// <summary>
/// 创建BitmapDecoder的像素转换器,并给转换设置属性(裁剪边框,缩放尺寸)
/// </summary>
/// <param name="decoder">要修改的解码数据</param>
/// <param name="startX">裁剪边框左上角X位置</param>
/// <param name="startY">裁剪边框左上角Y位置</param>
/// <param name="width">裁剪边框宽度</param>
/// <param name="height">裁剪边框高度</param>
/// <param name="scaledWidth">缩放后的像素宽度</param>
/// <param name="scaledHeight">缩放后的像素高度</param>
/// <returns></returns>
public static async Task<byte[]> GetPixelData(BitmapDecoder decoder, uint startX, uint startY, uint width, uint height, uint scaledWidth, uint scaledHeight)
{ //获取裁剪的边框尺寸,指定左上角位置(startX,startY)及裁剪高度height和宽度width;
#region define裁剪边框尺寸;
BitmapBounds bound = new BitmapBounds();
bound.X = startX;
bound.Y = startY;
bound.Width = width;
bound.Height = height;
#endregion //创建位图的像素数据的转换器
#region define转换器各属性
BitmapTransform tran = new BitmapTransform(); //将裁剪尺寸的属性bound,赋值到tran.Bounds中
tran.Bounds = bound; //define转换器中缩放尺寸,
tran.ScaledWidth = scaledWidth;
tran.ScaledHeight = scaledHeight;
#endregion //获得像素数据
var v = await decoder.GetPixelDataAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, tran, ExifOrientationMode.IgnoreExifOrientation, ColorManagementMode.ColorManageToSRgb);
//从像素数据中得到二进制像素数据
byte[] pixels = v.DetachPixelData();
return pixels;//返回
}
#endregion

4.接下来是对上条代码获得的像素数据按要求进行裁剪,并返回一个WriteableBitmap类型的BitmapSource:

        public async static Task<WriteableBitmap> Get_Image()
{ //获得“图片.bmp”图片文件
StorageFile imageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///PetsData/图片.bmp"));
//创建随机访问流,读出图片数据,放入到stream中
using (IRandomAccessStream stream = await imageFile.OpenAsync(FileAccessMode.Read))
{
//x,y代表图片左上角位置,width、height代表裁剪边框的大小
uint x = ;
uint y = ;
uint width = ;
uint height = ; //用解码类对数据流进行访问解码
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
//对获得的解码后的像素数据流进行修改,按边框x, y, width, height尺寸修改;
//由于不对源图片进行缩放处理,所以GetPixelData()方法后两位参数直接赋源图片的尺寸像素decoder.PixelWidth, decoder.PixelHeight;
byte[] pixels = await GetPixelData(decoder, x, y, width, height, decoder.PixelWidth, decoder.PixelHeight);
//创建可写入的BitmapSource wp;
WriteableBitmap wb = new WriteableBitmap(, );
Stream pixStream = wb.PixelBuffer.AsStream();
//写入裁剪的像素数据大小;
pixStream.Write(pixels, , pixels.Length);
//返回WriteableBitmap类型的BitmapSource
return wb;
} }

5.然后对名为"img1"的Image图像控件的Source进行赋值

this.img1.Source = await Get_Image();

6.这就大功告成了;

最后,本文没有使用编码的类BitmapEncoder,什么时候用我现在还没搞清楚,望大神们指导;

 

WP8.1开发对图片进行裁剪(截取)一部分的更多相关文章

  1. C# Windows Phone 8 WP8 高级开发,制作不循环 Pivot ,图片(Gallery)导览不求人! 内附图文教学!!

    原文:C# Windows Phone 8 WP8 高级开发,制作不循环 Pivot ,图片(Gallery)导览不求人! 内附图文教学!! 一般我们在开发Winodws Phone APP 的时候往 ...

  2. WP8.1开发:简单天气预报应用(转)

    今天小梦给大家分享一个简单的天气预报应用源码:调用的是百度API.整个应用都没有什么难点.只是一个简单的网络请求和json数据处理.在WP8.1有小娜的情况下,天气预报应用还有意义吗?我认为还是有点意 ...

  3. C#从大图中截取一部分图片

    #region 从大图中截取一部分图片 /// <summary> /// 从大图中截取一部分图片 /// </summary> /// <param name=&quo ...

  4. Android第三方开源图片裁剪截取:cropper

     Android第三方开源图片裁剪截取:cropper 很多app都需要裁剪截取图片作为头像.logo之类,而cropper是github上的一个针对Android平台的.第三方开源图片裁剪截取项 ...

  5. WP8.1开发:简单的天气预报应用

    今天小梦给大家分享一个简单的天气预报应用源码:调用的是百度API.整个应用都没有什么难点.只是一个简单的网络请求和json数据处理.在WP8.1有小娜的情况下,天气预报应用还有意义吗?我认为还是有点意 ...

  6. C# 从图片中截取一部分图片,并返回所截取的图片

    /// <summary> /// 从图片中截取一部分图片 /// </summary> /// <param name="fromImagePath" ...

  7. 1_1准备工作[wp8特色开发与编程技巧]

    1准备工作 大家好,我是徐文康,今天我要开始带大家玩转windowsphone8 app的开发 在这一套视频中,我将带大家从零开始学习编程.在互联网时代熟悉编程是非常有必要的.差异化竞争将变成趋势,那 ...

  8. 质问微软 WP8.1开发HTTPS 真费劲

    本人用C#多年,WPF2年,一直想做点应用为WP生态贡献一点力量,最近终于有机会接触了 家里的本子是2年前的低压I3,不支持虚拟化,一直没有真机.最近同事妈妈换下来一个820给我拿来做开发用,非常感谢 ...

  9. (wp8.1开发)触摸键从推出变返回

    ---恢复内容开始--- 今天开发wp8.1,遇到这样一个问题,从第一个页面跳到第二个页面,在第二个页面按返回,结果程序退出了.原来是系统把返回键定义成退出了. 解决办法: 在第一个页面加入如下代码 ...

随机推荐

  1. 微软企业库DBBA的研究

    Summary:如何入门使用Data Access Application Block,可以参考Enterprise Library 3.1中文帮助:数据访问应用程序块.这篇文章侧重在DAAB工作原理 ...

  2. UVa 10684 - The jackpot

    题目大意:给一个序列,求最大连续和. 用sum[i]表示前i个元素之和,那么以第i个元素结尾的最大连续和就是sum[i]-sum[j] (j<i)的最大值,也就是找前i-1个位置sum[]的最小 ...

  3. 利用 Grunt (几乎)无痛地做前端开发 (一)之单元测试

    前言 如果你想开发一个js应用,甭管多简单,都要先创建整个宇宙 来看看我们的Javascript小宇宙: 确定如何根据需求.功能划分模块,如何将代码分成多个文件开发,合成一个发布 保证上一条的同时,使 ...

  4. PHP新手之学习类与对象(1)

    本文介绍的是PHP程序设计语言中类和对象的基本知识,适合初学者阅读,希望对你有帮助,一起来看. PHP 5 引入了新的对象模型(Object Model).完全重写了 PHP 处理对象的方式,允许更佳 ...

  5. MYSQL 函数复习

    数学函数    ABS(X)    返回X的绝对值    SQRT(x)        返回非负数X的二次方根    MOD(x,y)    返回x被y除后的余数    CEIL(x)         ...

  6. iOS 之 assign、retain、copy、nonatomic

    1. assign 1.1. 普通赋值 一般用于基本类型 1.2. 常见委托设计模式 防止循环引用 2. retain 保留计数,获取了对象的所有权.引用计数在原有基础上加1. 3. copy 同re ...

  7. java 二维码

    在http://www.ostools.net/qr看到了一个生成二维码的工具,于是就产生了一个想法: 为什么自己不做一个二维码的生成和解析工具呢?花了一个多钟的时间,嘿嘿,就做出来啦... 先来看看 ...

  8. SQL server存储过程:数据的插入和更新

    存储过程的功能非常强大,在某种程度上甚至可以替代业务逻辑层, 接下来就一个小例子来说明,用存储过程插入或更新语句. 1.数据库表结构 所用数据库为Sql Server2008. 2.创建存储过程 (1 ...

  9. Canvas 图片灰度

    我们可以通过下面几种方法,将其转换为灰度: 1.浮点算法:Gray=R*0.3+G*0.59+B*0.11 2.整数方法:Gray=(R*30+G*59+B*11)/100 3.移位方法:Gray = ...

  10. 小兔JS教程(五) 简单易懂的JSON入门

    上一节的参考答案: http://xiaotublog.com/demo.html?path=homework/04/index2 本节重点来介绍一下JSON,JSON(JavaScript Obje ...