Windows Phone 7实用开发技巧(32):照片角度处理
2012-01-15 11:27
531 查看
在实际项目中,可能需要用户从相册中选择图片然后进行相应的处理。但是不知道大家有没有发现这样一种情况,就是手机里看是竖着的,但是上传到微博或者哪里的时候确实横着的。一种情况是你拿手机竖着拍照得话,照片就是横着的,虽然在手机里看是竖着的。(可能有点抽象,遇到此情况的同学应该深有感触) 那么我们在客户端中应
在实际项目中,可能需要用户从相册中选择图片然后进行相应的处理。但是不知道大家有没有发现这样一种情况,就是手机里看是竖着的,但是上传到微博或者哪里的时候确实横着的。一种情况是你拿手机竖着拍照得话,照片就是横着的,虽然在手机里看是竖着的。(可能有点抽象,遇到此情况的同学应该深有感触)
那么我们在客户端中应该如何处理这种情况呢?一种想法是获取图片的角度,如果是90°,就把照片翻转过来,再进行相应的操作。那这样就涉及到2个问题
1. 如何获取相册中照片的角度
2. 如何翻转已有的照片(流、或者Bitmap或者WriteableBitmap)
查看了系统的API,并没有对相片的角度提供支持,但是我们可以使用ExifLib开源库去做。
下述的方法就是获取选取图片的角度的
获取到角度后,如果角度是90°,即是反的,我们需要将其纠正过来,可以使用如下的方法:
原文Handling
picture orientation in CameraCaptureTask in Windows Phone 7
本文来自Alexis的博客,原文地址:/article/4705636.html
在实际项目中,可能需要用户从相册中选择图片然后进行相应的处理。但是不知道大家有没有发现这样一种情况,就是手机里看是竖着的,但是上传到微博或者哪里的时候确实横着的。一种情况是你拿手机竖着拍照得话,照片就是横着的,虽然在手机里看是竖着的。(可能有点抽象,遇到此情况的同学应该深有感触)
那么我们在客户端中应该如何处理这种情况呢?一种想法是获取图片的角度,如果是90°,就把照片翻转过来,再进行相应的操作。那这样就涉及到2个问题
1. 如何获取相册中照片的角度
2. 如何翻转已有的照片(流、或者Bitmap或者WriteableBitmap)
查看了系统的API,并没有对相片的角度提供支持,但是我们可以使用ExifLib开源库去做。
下述的方法就是获取选取图片的角度的
/// <summary> /// get angle of photo /// </summary> /// <param name="stream">photo stream</param> /// <param name="filename">photo name</param> /// <returns>angle of the photo</returns> public static int GetAngle(Stream stream, string filename) { ExifLib.ExifOrientation _orientation; int _angle = 0; stream.Position = 0; JpegInfo info = ExifReader.ReadJpeg(stream, filename); if (info!=null) { _orientation = info.Orientation; switch (info.Orientation) { case ExifOrientation.TopLeft: case ExifOrientation.Undefined: _angle = 0; break; case ExifOrientation.TopRight: _angle = 90; break; case ExifOrientation.BottomRight: _angle = 180; break; case ExifOrientation.BottomLeft: _angle = 270; break; } } return _angle; }
获取到角度后,如果角度是90°,即是反的,我们需要将其纠正过来,可以使用如下的方法:
private Stream RotateStream(Stream stream, int angle) { stream.Position = 0; if (angle % 90 != 0 || angle < 0) throw new ArgumentException(); if (angle % 360 == 0) return stream; BitmapImage bitmap = new BitmapImage(); bitmap.SetSource(stream); WriteableBitmap wbSource = new WriteableBitmap(bitmap); WriteableBitmap wbTarget = null; if (angle % 180 == 0) { wbTarget = new WriteableBitmap(wbSource.PixelWidth, wbSource.PixelHeight); } else { wbTarget = new WriteableBitmap(wbSource.PixelHeight, wbSource.PixelWidth); } for (int x = 0; x < wbSource.PixelWidth; x++) { for (int y = 0; y < wbSource.PixelHeight; y++) { switch (angle % 360) { case 90: wbTarget.Pixels[(wbSource.PixelHeight - y - 1) + x * wbTarget.PixelWidth] = wbSource.Pixels[x + y * wbSource.PixelWidth]; break; case 180: wbTarget.Pixels[(wbSource.PixelWidth - x - 1) + (wbSource.PixelHeight - y - 1) * wbSource.PixelWidth] = wbSource.Pixels[x + y * wbSource.PixelWidth]; break; case 270: wbTarget.Pixels[y + (wbSource.PixelWidth - x - 1) * wbTarget.PixelWidth] = wbSource.Pixels[x + y * wbSource.PixelWidth]; break; } } } MemoryStream targetStream = new MemoryStream(); wbTarget.SaveJpeg(targetStream, wbTarget.PixelWidth, wbTarget.PixelHeight, 0, 100); return targetStream; }
源码下载 |
picture orientation in CameraCaptureTask in Windows Phone 7
本文来自Alexis的博客,原文地址:/article/4705636.html
相关文章推荐
- Windows Phone实用开发技巧(32):照片角度处理
- Windows Phone实用开发技巧(32):照片角度处理
- Windows Phone开发技巧:照片角度处理
- Windows Phone 实用开发技巧(10):Windows Phone 中处理图片的技巧
- Windows Phone 实用开发技巧(10):Windows Phone 中处理图片的技巧 推荐
- Windows Phone 实用开发技巧(14):输入框隐藏SIP事件
- Windows Phone实用开发技巧(1):保存图片及加载图片
- Windows Phone实用开发技巧(40):使用NGif创建GIF图片
- Windows Phone 实用开发技巧(9):自定义Windows Phone 页面切换动画
- Windows Phone 实用开发技巧(21):自动循环播放视频
- Windows Phone 实用开发技巧(5):让你的手机在运行应用程序运行时不自动锁屏
- Windows Phone 实用开发技巧(16):Windows Phone 中编辑图片
- Windows Phone实用开发技巧(1):保存图片及加载图片
- Windows Phone 实用开发技巧(19):使用ProgressIndicator做进度显示 推荐
- Windows Phone 实用开发技巧(25):Windows Phone读取本地数据
- Windows Phone 实用开发技巧(22):使用日志记录当前信息与异常信息
- Windows Phone 实用开发技巧(5):让你的手机在运行应用程序运行时不自动锁屏 推荐
- Windows Phone 实用开发技巧(20):ApplicationBar 的Text国际化
- Windows Phone 实用开发技巧(20):ApplicationBar 的Text国际化 推荐
- Windows Phone实用开发技巧(38):图片拼接