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像素)的像素数据的方法,代码如下:

 1 #region
 2        /// <summary>
 3         /// 创建BitmapDecoder的像素转换器,并给转换设置属性(裁剪边框,缩放尺寸)
 4         /// </summary>
 5         /// <param name="decoder">要修改的解码数据</param>
 6         /// <param name="startX">裁剪边框左上角X位置</param>
 7         /// <param name="startY">裁剪边框左上角Y位置</param>
 8         /// <param name="width">裁剪边框宽度</param>
 9         /// <param name="height">裁剪边框高度</param>
10         /// <param name="scaledWidth">缩放后的像素宽度</param>
11         /// <param name="scaledHeight">缩放后的像素高度</param>
12         /// <returns></returns>
13         public static async Task<byte[]> GetPixelData(BitmapDecoder decoder, uint startX, uint startY, uint width, uint height, uint scaledWidth, uint scaledHeight)
14         {
15 
16 
17             //获取裁剪的边框尺寸,指定左上角位置(startX,startY)及裁剪高度height和宽度width;
18             #region define裁剪边框尺寸;
19             BitmapBounds bound = new BitmapBounds();
20             bound.X = startX;
21             bound.Y = startY;
22             bound.Width = width;
23             bound.Height = height;
24             #endregion
25 
26             //创建位图的像素数据的转换器
27             #region define转换器各属性
28             BitmapTransform tran = new BitmapTransform();
29 
30             //将裁剪尺寸的属性bound,赋值到tran.Bounds中
31             tran.Bounds = bound;
32 
33             //define转换器中缩放尺寸,
34             tran.ScaledWidth = scaledWidth;
35             tran.ScaledHeight = scaledHeight;
36             #endregion
37 
38             //获得像素数据
39             var v = await decoder.GetPixelDataAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, tran, ExifOrientationMode.IgnoreExifOrientation, ColorManagementMode.ColorManageToSRgb);
40             //从像素数据中得到二进制像素数据
41             byte[] pixels = v.DetachPixelData();
42             return pixels;//返回
43         }
44 #endregion
View Code

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

 1        public async static Task<WriteableBitmap> Get_Image()
 2         {
 3             
 4 
 5             //获得“图片.bmp”图片文件
 6             StorageFile imageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///PetsData/图片.bmp"));
 7             //创建随机访问流,读出图片数据,放入到stream中
 8             using (IRandomAccessStream stream = await imageFile.OpenAsync(FileAccessMode.Read))
 9             {
10                 //x,y代表图片左上角位置,width、height代表裁剪边框的大小
11                   uint   x = 0;
12                   uint   y = 0; 
13                   uint   width = 28; 
14                   uint   height = 37; 
15          
16 //用解码类对数据流进行访问解码
17                 BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
18  //对获得的解码后的像素数据流进行修改,按边框x, y, width, height尺寸修改;
19                 //由于不对源图片进行缩放处理,所以GetPixelData()方法后两位参数直接赋源图片的尺寸像素decoder.PixelWidth, decoder.PixelHeight;
20                 byte[] pixels = await GetPixelData(decoder, x, y, width, height, decoder.PixelWidth, decoder.PixelHeight);
21                 //创建可写入的BitmapSource wp;
22                 WriteableBitmap wb = new WriteableBitmap(28, 37);
23                 Stream pixStream = wb.PixelBuffer.AsStream();
24 //写入裁剪的像素数据大小;
25                 pixStream.Write(pixels, 0, pixels.Length);
26 //返回WriteableBitmap类型的BitmapSource
27                 return wb;
28             }
29 
30         }                
View Code

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

this.img1.Source = await Get_Image();

6.这就大功告成了;

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

 

 

转载于:https://www.cnblogs.com/zmlohw/p/5136989.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值