在实际项目中,可能需要用户从相册中选择图片然后进行相应的处理。但是不知道大家有没有发现这样一种情况,就是手机里看是竖着的,但是上传到微博或者哪里的时候确实横着的。一种情况是你拿手机竖着拍照得话,照片就是横着的,虽然在手机里看是竖着的。(可能有点抽象,遇到此情况的同学应该深有感触)

那么我们在客户端中应该如何处理这种情况呢?一种想法是获取图片的角度,如果是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):照片角度处理相关推荐

  1. Windows Phone 实用开发技巧(10):Windows Phone 中处理图片的技巧

    在开发Windows Phone应用程序的时候,或多或少会与图片打交道,下面总结下Windows Phone 中处理图片的一些技巧 1.  图片格式. 2.  图片编译方式 3.  图片加载方式 4. ...

  2. Windows Phone实用开发技巧(1):保存图片及加载图片

    在Windows Phone中,我们可能会有这样的需求:自定义应用程序的背景图片. 实际的流程是这样:用户选择图片,保存至隔离存储空间,(下一次启动时或者立即)加载图片使其成为背景图片. 下面以具体的 ...

  3. Windows Phone 实用开发技巧(9):自定义Windows Phone 页面切换动画

    在Silverlight for Windows Phone ToolKit 中默认中有自带的页面Transitions:RollTransition.RotateTransition.SlideTr ...

  4. Windows Phone 实用开发技巧(3):输入框自动聚焦并打开SIP

    大家看到这个标题,可以会问什么是SIP(看过我Windows Phone 7 Tips系列的童鞋应该知道),SIP全称为Soft Input Panel,即触摸屏中的输入键盘. 在Windows Ph ...

  5. Windows Phone 实用开发技巧(18):使用SystemTray显示全局消息提醒

    在Windows Phone 7 (Nodo)之前的版本中,我们要在应用程序显示消息提醒,或者是进度提示,通常的做法在页面的顶部放置一个专门的容器(如一个Grid),里面放置一些文本和Performa ...

  6. Windows半透明窗口开发技巧

    Windows半透明窗口开发技巧 www.visual-gear.com 原创技术文章 在windows平台上从窗口绘图有两种方法: 第一种响应窗口的WM_PAINT消息,使用窗口DC进行绘制 第二种 ...

  7. ES6 实用开发技巧

    Javascript - ES6 实用开发技巧 本文只罗列出在 ES6 开发过程中相对实用的内容,并非一个高大全的文档,如果希望查阅详细的内容,可购买阮一峰老师所出版的 ES6 相关图书.另外阮一峰老 ...

  8. ES6 javascript 实用开发技巧

    Javascript - ES6 javascript 实用开发技巧 本文只罗列出在 ES6 开发过程中相对实用的内容,并非一个高大全的文档,如果希望查阅详细的内容,可购买阮一峰老师所出版的 ES6 ...

  9. 总结Windows XP实用优化技巧大放送(转)

    Windows XP是目前使用得最多的操作系统,为此书虫将自己在这几年使用Windows XP的经验汇总成连载奉献给大家.条条力求精炼,实用.今天送出的是大家都比较关心的Windows XP优化技巧. ...

最新文章

  1. 未解决oracle错误12505、01034、27101
  2. 转载 foreach比递归效率低
  3. Ibatis 生成工具ibator的使用 适用于ibaits2
  4. mfc大观之三(创建对象)
  5. “错题集”帮你期末考试冲向满分
  6. 梦里梦到的人是谁在想谁?
  7. JAVA三大器之拦截器
  8. 纬地道路纵断面设计教程_市政道路从识图算量到施工工艺,一篇全搞定
  9. 微信小程序图片上传以及剪切(image-cropper的简单使用)
  10. 硬件编程-----根据时序图写C语言驱动
  11. 计算机辅助翻译专业实训报告,计算机辅助翻译实训报告格式(7页)-原创力文档...
  12. python谷歌小恐龙,这还是你断网时的样子嘛~
  13. NCRE-嵌入式系统开发工程师-计算机组成与接口知识整理
  14. 为什么要画ER图?有哪些画图规范?
  15. 关于在线评论有用性的论文研读笔记---51-60篇
  16. cjk-ext-e 字体
  17. 网络安全运维人员面临的痛点分析
  18. 怎么把excel文件转成dta_如何将excel表格数据转化为dta格式-怎么把dat文件转换成Excel文件,里面的数据格式要......
  19. 聊聊百度搜索背后的故事
  20. 华为岗位分类对工作的分析与启示

热门文章

  1. HTTP中Get与Post的区别
  2. Banknote Dataset(钞票数据集)介绍
  3. 98级计算机应用教材,西安外事学院98级计算机应用9806班毕业二十年校友返校
  4. android camera工程师,浅析Android Camera架构
  5. 在linux中怎么重置mysql密码_详解如何在Linux(CentOS)下重置MySQL根(Root)密码
  6. 服务器的操作系统分哪几类,服务器的操作系统分哪几类
  7. python试题for循环布尔值_Python自我修炼(升仙中....整数,布尔值,字符串,for循环)
  8. bpython ipython_安装ipython后命令找不到ipython bpython -bash: *python: command not found
  9. html实现pdf预览打印机,Pdf操作(HTML转PDF,PDF直接网页连接打印机)
  10. java中后台是那一部分_一套Java后台管理系统,拿来即用(附项目地址)