WP8.1开发对图片进行裁剪(截取)一部分
对于这个内容,我是在学习插入图片时遇到的问题,在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开发对图片进行裁剪(截取)一部分的更多相关文章
- C# Windows Phone 8 WP8 高级开发,制作不循环 Pivot ,图片(Gallery)导览不求人! 内附图文教学!!
原文:C# Windows Phone 8 WP8 高级开发,制作不循环 Pivot ,图片(Gallery)导览不求人! 内附图文教学!! 一般我们在开发Winodws Phone APP 的时候往 ...
- WP8.1开发:简单天气预报应用(转)
今天小梦给大家分享一个简单的天气预报应用源码:调用的是百度API.整个应用都没有什么难点.只是一个简单的网络请求和json数据处理.在WP8.1有小娜的情况下,天气预报应用还有意义吗?我认为还是有点意 ...
- C#从大图中截取一部分图片
#region 从大图中截取一部分图片 /// <summary> /// 从大图中截取一部分图片 /// </summary> /// <param name=&quo ...
- Android第三方开源图片裁剪截取:cropper
Android第三方开源图片裁剪截取:cropper 很多app都需要裁剪截取图片作为头像.logo之类,而cropper是github上的一个针对Android平台的.第三方开源图片裁剪截取项 ...
- WP8.1开发:简单的天气预报应用
今天小梦给大家分享一个简单的天气预报应用源码:调用的是百度API.整个应用都没有什么难点.只是一个简单的网络请求和json数据处理.在WP8.1有小娜的情况下,天气预报应用还有意义吗?我认为还是有点意 ...
- C# 从图片中截取一部分图片,并返回所截取的图片
/// <summary> /// 从图片中截取一部分图片 /// </summary> /// <param name="fromImagePath" ...
- 1_1准备工作[wp8特色开发与编程技巧]
1准备工作 大家好,我是徐文康,今天我要开始带大家玩转windowsphone8 app的开发 在这一套视频中,我将带大家从零开始学习编程.在互联网时代熟悉编程是非常有必要的.差异化竞争将变成趋势,那 ...
- 质问微软 WP8.1开发HTTPS 真费劲
本人用C#多年,WPF2年,一直想做点应用为WP生态贡献一点力量,最近终于有机会接触了 家里的本子是2年前的低压I3,不支持虚拟化,一直没有真机.最近同事妈妈换下来一个820给我拿来做开发用,非常感谢 ...
- (wp8.1开发)触摸键从推出变返回
---恢复内容开始--- 今天开发wp8.1,遇到这样一个问题,从第一个页面跳到第二个页面,在第二个页面按返回,结果程序退出了.原来是系统把返回键定义成退出了. 解决办法: 在第一个页面加入如下代码 ...
随机推荐
- UVa 543 - Goldbach's Conjecture
题目大意:给一个偶数,判断是否是两个素数的和. 先用sieve方法生成一个素数表,然后再进行判断即可. #include <cstdio> #include <vector> ...
- java 解析excel
2014年2月25日 14:24:48 解析excel方法 //首先是jar包下载,请自行百度 //代码 package cn.wuwenfu.excel; import java.io.File; ...
- poj 3641 ——2016——3——15
传送门:http://poj.org/problem?id=3461 题目大意:给你两个字符串p和s,求出p在s中出现的次数. 题解:这一眼看过去就知道是KMP,作为模板来写是最好不过了.... 这道 ...
- React Native 之 HelloWorld
1. 切换目录 输入之前要切换到要保存的目录 2. 修改下载源 cd ~/ vim .npmrc 添加 registry = https://registry.npm.taobao.org 3. 在终 ...
- iOS 程序测试、程序优化、提交前检测
1. 数据显示如果是数值要考虑到0的情况 2. 数据变化对前一个页面及相关页面的影响,也即数据同步问题.如果是有其它设备改变数据,那数据请求就应该在willappear(视图将要显示事件)进行请求,以 ...
- iOS 之UICollectionView 开发步骤 之 OC
说起来容易做起来难. 那么我就不说了,来做吧.这就是我的style. 鉴于现在的主流还是OC,那么示例程序还用OC来写,后续补写Swift程序,这里先占个坑. 废话不多说,下面开发步骤来了: 1. 创 ...
- C语言中strcpy,strcmp,strlen,strcat函数原型
//strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, const char ...
- SuperSocket入门(二)- 探索AppServer、AppSession,Conmmand和App.config
在上一篇文章中,我们已经了解到了如何在SuperSocket处理客户端请求. 同时我们可能会发现一个问题,如果我们的服务器端包含有很多复杂的业务逻辑,这样的switch/case代码将会很 ...
- Flux --> Redux --> Redux React 入门
本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...
- GDB中的backtrace命令
backtrace命令,可以用于回溯函数调用栈. 例如:当出现段错误的时候,执行backtrace,可以看到是哪里的调用,产生的这个段错误.