Windows Phone实用开发技巧(32):照片角度处理

news/2024/7/3 2:33:29

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

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


http://lihuaxi.xjx100.cn/news/250140.html

相关文章

免费版CloudFlare CDN基本设置参考

CDN有很多&#xff0c;网上都有介绍&#xff0c;用户比较多的CloudFlare CDN大家都知道&#xff0c;配置起来也比较简单&#xff0c;合理的配置&#xff0c;才能提升网站的速度和网站安全。不同的网站需求配置不一样&#xff0c;以下是我的配置情况&#xff0c;仅供参考。 我网…

nginx 通过proxy_next_upstream实现容灾和重复处理问题

proxy_next_upstream指令语法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 |http_504 |http_404 | off ...; 默认值: proxy_next_upstream error timeout; 上下文: http, server, locationerror # 和后端服务器建立连接时&…

【编程题】【Scratch二级】2019.09 绘制雪花图案

绘制雪花图案 1. 准备工作 (1)隐藏小猫角色。 2. 功能实现 (1)初始设定雪花中心点的坐标为(x=0,y=0); (2)线条粗细1,线条颜色为任意彩色; (3)点击绿旗,在屏幕上画出均匀分布的5个三角形的雪花图案。 3. 设计思路与实现 (1)角色分析 角色:隐藏的小猫 …

在SQL Server中调用.NET程序集

使用到这东西完全是个巧合和无奈之举。不小心在数据库中插入了一些HttpUtility.UrlEncodeUnicode之后的数据。数据库里的一些字段成了%uxxxx%uxxxx这样的结构。 搜索了半天T-SQL UrlDecode的函数&#xff0c;发现都不支持上面这种Unicode的。自己对T-SQL又不熟悉&#xff0c;时…

Android Drawable 详解(教你画画!)

参考 1、Android中的Drawable基础与自定义Drawable2、android中的drawable资源3、Android开发之Shape详细解读 Drawable分类 Noxml标签Class类含义1shapeShapeDrawable特定形状&#xff0c;模型的图样2selectorStateListDrawable不同状态选择不同的图样3layer-listLayerDrawabl…

Oracle数据库精讲与疑难解析(第2版)

Oracle数据库精讲与疑难解析&#xff08;第2版&#xff09; 赵振平编著 ISBN978-7-121-20021-2 2013年4月出版 定价&#xff1a;148.00元 1100页 16开 编辑推荐 耗时3年&#xff0c;作者曾为本书辞职在家专心写作 754个实务&#xff0c;件件源自实际工作的经验与教训&#xff0…

SpringMVC + Hibernate-Validator 参数校验

2019独角兽企业重金招聘Python工程师标准>>> 前言&#xff1a; Web开发中&#xff0c;最为常见的场景就是前端表单数据、Json数据与后端实体类的绑定&#xff0c;即使JS能校验并阻止大部分的必填漏填的风险&#xff0c;但并不能防止恶意破坏者修改脚本。因此后端参数…

【编程题】【Scratch二级】2019.09 制作蝙蝠冲关游戏

制作蝙蝠冲关游戏 1.准备工作 (1)导入蝙蝠角色、分别绘制障碍物、大地角色。 2.功能实现 需要达到的效果:通过键盘上的空格键控制蝙蝠往上飞,当碰到障碍物或者大地时,游戏结束,否则得分。 (1)蝙蝠角色:当点击绿旗,蝙蝠自上往下飞,当按下空格键,蝙蝠往上飞,当碰…