标签:
对于这个内容,我是在学习插入图片时遇到的问题,在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
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 }
5.然后对名为"img1"的Image图像控件的Source进行赋值
this.img1.Source = await Get_Image();
6.这就大功告成了;
最后,本文没有使用编码的类BitmapEncoder,什么时候用我现在还没搞清楚,望大神们指导;
标签:
原文地址:http://www.cnblogs.com/zmlohw/p/5136989.html