Windows Phone开发技巧:照片角度处理

简介:

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

  那么我们在客户端中应该如何处理这种情况呢?一种想法是获取图片的角度,如果是90°,就把照片翻转过来,再进行相应的操作。那这样就涉及到2个问题

  1. 如何获取相册中照片的角度

  2. 如何翻转已有的照片(流、或者Bitmap或者WriteableBitmap)

  查看了系统的API,并没有对相片的角度提供支持,但是我们可以使用ExifLib开源库去做。

  下述的方法就是获取选取图片的角度的

  ///

  /// get angle of photo

  ///

  /// photo stream

  /// photo name

  /// angle of the photo

  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;

  }
 









本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/751291,如需转载请自行联系原作者
目录
相关文章
|
Android开发 iOS开发 Windows
Windows Phone 寿终正寝了,这些经典机型你还记得吗?
不久前,随着最后一家WP手机厂商惠普宣布取消今后Windows Phone的研发计划,以及微软官方声明对WP8.1系统今后所有升级维护的终止,WP手机,作为曾经和安卓手机、苹果手机并驾齐驱的三大智能手机之一,正式寿终正寝。
1251 0
Windows Phone 寿终正寝了,这些经典机型你还记得吗?
|
XML 开发框架 前端开发
Windows Phone快速入门需掌握哪些能力
在此之前,先普及下Windows Phone的概念和开发工具的介绍。 Windows Phone是微软公司开发的手机操作系统,它将微软旗下的Xbox Live游戏、Xbox Music音乐与独特的视频体验集成至手机中。2012年6月21日,微软正式发布Windows Phone 8,采用和Windows 8相同的Windows NT内核,同时也针对市场的Windows Phone 7.5发布Windows Phone 7.8。
135 0
Windows Phone快速入门需掌握哪些能力
|
编解码 前端开发 JavaScript
Windows Phone 下开发 LBS 应用
基于位置的服务(Location Based Service,LBS),它是通过电信移动运营商的无线电通讯网络(如GSM网、CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息(地理坐标,或大地坐标),在GIS(Geographic Information System,地理信息系统)平台的支持下,为用户提供相应服务的一种增值业务。
162 0
|
移动开发 Android开发 开发者
Windows Phone 8.1 新功能汇总 开发者预览版开放下载
在Build 2014大会上,微软正式发布了传闻已久的Windows Phone 8.1系统,所有的Windows Phone 8手机都可以升级,微软这次可谓是十分厚道。虽然并非迭代升级,但WP 8.1还是拥有很多重大更新,对于微软进一步完善移动平台拥有积极的意义。下面,就一起来了解一下WP 8.1的主要新特性。
230 0
Windows Phone 8.1 新功能汇总 开发者预览版开放下载
|
Windows
win10找回Windows照片查看器
升级到Windows 10之后,很多“传统”的工具被Windows应用商店中的磁贴应用取代,好处就是它们会像手机应用一样,随时更新新版本,修补Bug或增强性能。缺点可能就像许多小伙伴固守在Windows7一样,改变了我们的使用习惯,或者把一些常用的功能“咔嚓”掉了。
1209 0