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,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
IDE 关系型数据库 开发工具
使用Visual Basic进行Windows窗体开发
【4月更文挑战第27天】本文介绍了使用Visual Basic进行Windows窗体(WinForms)开发的步骤,从搭建开发环境到创建、设计用户界面,再到编写事件驱动的代码和数据绑定。Visual Basic结合WinForms提供了一种易学易用的桌面应用开发方案。通过调试、优化、部署和维护,开发者可以构建专业应用程序。随着技术发展,掌握最新UI设计和开发工具对于保持竞争力至关重要。本文为初学者提供了基础指导,鼓励进一步探索和学习。
222 0
|
2月前
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
69 0
|
2月前
|
Ubuntu Linux Python
如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发
如何在WSL(Windows Subsystem for Linux)的Ubuntu环境中使用conda虚拟环境来为Windows上的PyCharm开发设置Python解释器。
157 0
|
3月前
|
存储 安全 程序员
Windows任务管理器开发原理与实现
Windows任务管理器开发原理与实现
|
4月前
|
人工智能 Windows
恢复消失的“Windows 照片查看器“
通过编辑Windows注册表来恢复右键菜单中消失的“Windows 照片查看器”,通过添加新的字符串值来关联图片文件类型,使得“Windows 照片查看器”重新出现在右键菜单中。
121 0
恢复消失的“Windows 照片查看器“
|
4月前
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
206 0
|
4月前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
393 0
|
5月前
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
136 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
6月前
|
网络安全 C++ Windows
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试
|
6月前
|
Windows
【Windows驱动开发】注册表的基本操作(创建、打开、修改、读取、枚举)(附源码)
【Windows驱动开发】注册表的基本操作(创建、打开、修改、读取、枚举)(附源码)