Windows Phone实用开发技巧(32):照片角度处理
在实际项目中,可能需要用户从相册中选择图片然后进行相应的处理。但是不知道大家有没有发现这样一种情况,就是手机里看是竖着的,但是上传到微博或者哪里的时候确实横着的。一种情况是你拿手机竖着拍照得话,照片就是横着的,虽然在手机里看是竖着的。(可能有点抽象,遇到此情况的同学应该深有感触)
那么我们在客户端中应该如何处理这种情况呢?一种想法是获取图片的角度,如果是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; }
Demo源代码下载
原文Handling picture orientation in CameraCaptureTask in Windows Phone 7
转载于:https://www.cnblogs.com/alexis/archive/2011/12/18/2291995.html
Windows Phone实用开发技巧(32):照片角度处理相关推荐
- Windows Phone 实用开发技巧(10):Windows Phone 中处理图片的技巧
在开发Windows Phone应用程序的时候,或多或少会与图片打交道,下面总结下Windows Phone 中处理图片的一些技巧 1. 图片格式. 2. 图片编译方式 3. 图片加载方式 4. ...
- Windows Phone实用开发技巧(1):保存图片及加载图片
在Windows Phone中,我们可能会有这样的需求:自定义应用程序的背景图片. 实际的流程是这样:用户选择图片,保存至隔离存储空间,(下一次启动时或者立即)加载图片使其成为背景图片. 下面以具体的 ...
- Windows Phone 实用开发技巧(9):自定义Windows Phone 页面切换动画
在Silverlight for Windows Phone ToolKit 中默认中有自带的页面Transitions:RollTransition.RotateTransition.SlideTr ...
- Windows Phone 实用开发技巧(3):输入框自动聚焦并打开SIP
大家看到这个标题,可以会问什么是SIP(看过我Windows Phone 7 Tips系列的童鞋应该知道),SIP全称为Soft Input Panel,即触摸屏中的输入键盘. 在Windows Ph ...
- Windows Phone 实用开发技巧(18):使用SystemTray显示全局消息提醒
在Windows Phone 7 (Nodo)之前的版本中,我们要在应用程序显示消息提醒,或者是进度提示,通常的做法在页面的顶部放置一个专门的容器(如一个Grid),里面放置一些文本和Performa ...
- Windows半透明窗口开发技巧
Windows半透明窗口开发技巧 www.visual-gear.com 原创技术文章 在windows平台上从窗口绘图有两种方法: 第一种响应窗口的WM_PAINT消息,使用窗口DC进行绘制 第二种 ...
- ES6 实用开发技巧
Javascript - ES6 实用开发技巧 本文只罗列出在 ES6 开发过程中相对实用的内容,并非一个高大全的文档,如果希望查阅详细的内容,可购买阮一峰老师所出版的 ES6 相关图书.另外阮一峰老 ...
- ES6 javascript 实用开发技巧
Javascript - ES6 javascript 实用开发技巧 本文只罗列出在 ES6 开发过程中相对实用的内容,并非一个高大全的文档,如果希望查阅详细的内容,可购买阮一峰老师所出版的 ES6 ...
- 总结Windows XP实用优化技巧大放送(转)
Windows XP是目前使用得最多的操作系统,为此书虫将自己在这几年使用Windows XP的经验汇总成连载奉献给大家.条条力求精炼,实用.今天送出的是大家都比较关心的Windows XP优化技巧. ...
最新文章
- 未解决oracle错误12505、01034、27101
- 转载 foreach比递归效率低
- Ibatis 生成工具ibator的使用 适用于ibaits2
- mfc大观之三(创建对象)
- “错题集”帮你期末考试冲向满分
- 梦里梦到的人是谁在想谁?
- JAVA三大器之拦截器
- 纬地道路纵断面设计教程_市政道路从识图算量到施工工艺,一篇全搞定
- 微信小程序图片上传以及剪切(image-cropper的简单使用)
- 硬件编程-----根据时序图写C语言驱动
- 计算机辅助翻译专业实训报告,计算机辅助翻译实训报告格式(7页)-原创力文档...
- python谷歌小恐龙,这还是你断网时的样子嘛~
- NCRE-嵌入式系统开发工程师-计算机组成与接口知识整理
- 为什么要画ER图?有哪些画图规范?
- 关于在线评论有用性的论文研读笔记---51-60篇
- cjk-ext-e 字体
- 网络安全运维人员面临的痛点分析
- 怎么把excel文件转成dta_如何将excel表格数据转化为dta格式-怎么把dat文件转换成Excel文件,里面的数据格式要......
- 聊聊百度搜索背后的故事
- 华为岗位分类对工作的分析与启示
热门文章
- HTTP中Get与Post的区别
- Banknote Dataset(钞票数据集)介绍
- 98级计算机应用教材,西安外事学院98级计算机应用9806班毕业二十年校友返校
- android camera工程师,浅析Android Camera架构
- 在linux中怎么重置mysql密码_详解如何在Linux(CentOS)下重置MySQL根(Root)密码
- 服务器的操作系统分哪几类,服务器的操作系统分哪几类
- python试题for循环布尔值_Python自我修炼(升仙中....整数,布尔值,字符串,for循环)
- bpython ipython_安装ipython后命令找不到ipython bpython -bash: *python: command not found
- html实现pdf预览打印机,Pdf操作(HTML转PDF,PDF直接网页连接打印机)
- java中后台是那一部分_一套Java后台管理系统,拿来即用(附项目地址)