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,遇到这样一个问题,从第一个页面跳到第二个页面,在第二个页面按返回,结果程序退出了.原来是系统把返回键定义成退出了. 解决办法: 在第一个页面加入如下代码 ...
随机推荐
- Tsinsen-1487:分配游戏【树状数组】
首先一定要看到x + y + z = N这个条件,没看到就世界再见了. 赢的人得分需要大于等于2,那么无非就是 (x, y), (x, z), (y, z), (x, y, z) 大于其他的点.但是考 ...
- CSS实现导航条Tab切换的三种方法
前面的话 导航条Tab在页面中非常常见,本文说详细介绍CSS实现导航条Tab的三种方法 布局 根据上图所示,先规定几个定义,上图的模块整体叫做导航,由导航标题和导航内容组成.要实现上图所示的布 ...
- EntityFrameWork分页
EF分页代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...
- scrapy setting 备注
scrapy 脚本里面设置输出文件: process = CrawlerProcess(settings) process.settings.set('FEED_URI', 'wangyi.csv', ...
- bzoj1468
1468: Tree Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1023 Solved: 532[Submit][Status][Discuss] ...
- linux Cron 执行Django 任务计划
用shell 脚本调用python 脚本如下 #!/bin/bash export FLAVOR=liveexport PYTHONPATH=$PYTHONPATH:/home/alex/Django ...
- ExcelUtil
package cn.com.jansh.core.util; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi ...
- 创建TabBar
-(void)creatTabBarView { NSArray *imgArray=@[]; NSArray *selectImage=@[]; NSArray *names=@[]; for (i ...
- Selenium2(java)页面对象模型(Page Object) 八
在开发一个 Selenium WebDriver 测试,我们可以使用页面对象模型.这个模型可以使测 试脚本有更高的可维护性,减少了重复的代码,把页面抽象出来.对象模型也提供了一个注释,帮助缓存远程,避 ...
- js与php传递参数
这个问题在网页开发时经常遇到,其实解决办法非常简单,就是几行代码的事,不过各种js.php书上都没有,百度下来也乱七八糟的,有的能用,有的不能用.小编遇到这问题时认认真真研究了一上午,研究出一点心得, ...