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,遇到这样一个问题,从第一个页面跳到第二个页面,在第二个页面按返回,结果程序退出了.原来是系统把返回键定义成退出了. 解决办法: 在第一个页面加入如下代码 ...
随机推荐
- sql server 2008 学习笔记
sql server 2008 删除已有的实例 想从setup.exe中区卸载,没找到. 原来还是要从控制面板中卸载,卸载Microsoft SQL Server 2008 卸载界面会提示让你选择要删 ...
- php 实例说明 socket通信机制
php 实例说明 socket通信机制 张映 发表于 2010-04-24 分类目录: php 一,socket是什么 什么是socket 所谓socket通常也称作"套接字",用 ...
- Java Spring MVC项目搭建(一)——Spring MVC框架集成
1.Java JDK及Tomcat安装 我这里安装的是JDK 1.8 及 Tomcat 8,安装步骤详见:http://www.cnblogs.com/eczhou/p/6285248.html 2. ...
- SVN下载分支、合并分支
http://www.cnblogs.com/armyfai/p/3985660.html(不知道实际工作中怎么使用,有好多步骤感觉不是太理解) 从远处把库fork到本地,会有一个库文件夹 服务器库结 ...
- magento中文语言包的使用
magento中文语言包的使用,我们在百度上随便就能找到一大堆. 由于本人今天是第一次使用magento,找到目录magento/app/locale 并且用语言包中的locale文件夹替换掉mag ...
- [osgEarth]osgEarth
参考:http://bbs.osgchina.org/forum.php?mod=viewthread&tid=5484&extra=page%3D1&_dsign=70b15 ...
- iOS 项目上线流程
一.证书的导出 1.1 前期工作 首先你需要有一个苹果的开发者帐号,一个Mac系统. 如果没有帐号可以在打开http://developer.apple.com/ ...
- C# windows服务的创建与调试
Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Window ...
- cookie记忆换肤功能实战Demo
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- SSH系统介绍
SSH的系统中,对象的调用流程是:JSP->Action->Service->DAO->Hibernate,数据的流向是ActionFormBean接受用户的数据,Action ...