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,如需转载请自行联系原作者
目录
相关文章
|
IDE 关系型数据库 开发工具
使用Visual Basic进行Windows窗体开发
【4月更文挑战第27天】本文介绍了使用Visual Basic进行Windows窗体(WinForms)开发的步骤,从搭建开发环境到创建、设计用户界面,再到编写事件驱动的代码和数据绑定。Visual Basic结合WinForms提供了一种易学易用的桌面应用开发方案。通过调试、优化、部署和维护,开发者可以构建专业应用程序。随着技术发展,掌握最新UI设计和开发工具对于保持竞争力至关重要。本文为初学者提供了基础指导,鼓励进一步探索和学习。
753 0
|
Ubuntu Linux Python
如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发
如何在WSL(Windows Subsystem for Linux)的Ubuntu环境中使用conda虚拟环境来为Windows上的PyCharm开发设置Python解释器。
3048 1
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
836 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
存储 安全 程序员
Windows任务管理器开发原理与实现
Windows任务管理器开发原理与实现
|
人工智能 Windows
恢复消失的“Windows 照片查看器“
通过编辑Windows注册表来恢复右键菜单中消失的“Windows 照片查看器”,通过添加新的字符串值来关联图片文件类型,使得“Windows 照片查看器”重新出现在右键菜单中。
1049 0
恢复消失的“Windows 照片查看器“
|
算法 Linux Windows
FFmpeg开发笔记(十七)Windows环境给FFmpeg集成字幕库libass
在Windows环境下为FFmpeg集成字幕渲染库libass涉及多个步骤,包括安装freetype、libxml2、gperf、fontconfig、fribidi、harfbuzz和libass。每个库的安装都需要下载源码、配置、编译和安装,并更新PKG_CONFIG_PATH环境变量。最后,重新配置并编译FFmpeg以启用libass及相关依赖。完成上述步骤后,通过`ffmpeg -version`确认libass已成功集成。
1145 1
FFmpeg开发笔记(十七)Windows环境给FFmpeg集成字幕库libass
|
编解码 Linux Windows
FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr
在Windows环境下,为FFmpeg集成音频编解码库,包括libogg、libvorbis和opencore-amr,涉及下载源码、配置、编译和安装步骤。首先,安装libogg,通过配置、make和make install命令完成,并更新PKG_CONFIG_PATH。接着,安装libvorbis,同样配置、编译和安装,并修改pkgconfig文件。之后,安装opencore-amr。最后,重新配置并编译FFmpeg,启用ogg和amr支持,通过ffmpeg -version检查是否成功。整个过程需确保环境变量设置正确,并根据路径添加相应库。
835 1
FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr
|
Linux 编译器 C语言
FFmpeg开发笔记(二)搭建Windows系统的开发环境
在Windows上学习FFmpeg通常较困难,但通过安装预编译的FFmpeg开发包可以简化流程。首先需要安装MSYS2来模拟Linux环境。下载并执行MSYS2安装包,然后修改msys2_shell.cmd以继承Windows的Path变量。使用pacman安装必要的编译工具。接着,下载预编译的FFmpeg Windows包,解压并配置系统Path。最后,在MSYS2环境中运行`ffmpeg -version`确认安装成功。欲深入学习FFmpeg开发,推荐阅读《FFmpeg开发实战:从零基础到短视频上线》。
989 4
FFmpeg开发笔记(二)搭建Windows系统的开发环境
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
940 0
|
网络安全 C++ Windows
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试