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

简介:

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

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





     本文转自xshf12345 51CTO博客,原文链接:http://blog.51cto.com/alexis/748787,如需转载请自行联系原作者


相关文章
|
IDE 关系型数据库 开发工具
使用Visual Basic进行Windows窗体开发
【4月更文挑战第27天】本文介绍了使用Visual Basic进行Windows窗体(WinForms)开发的步骤,从搭建开发环境到创建、设计用户界面,再到编写事件驱动的代码和数据绑定。Visual Basic结合WinForms提供了一种易学易用的桌面应用开发方案。通过调试、优化、部署和维护,开发者可以构建专业应用程序。随着技术发展,掌握最新UI设计和开发工具对于保持竞争力至关重要。本文为初学者提供了基础指导,鼓励进一步探索和学习。
736 0
|
Ubuntu Linux Python
如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发
如何在WSL(Windows Subsystem for Linux)的Ubuntu环境中使用conda虚拟环境来为Windows上的PyCharm开发设置Python解释器。
3008 1
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
797 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
存储 安全 程序员
Windows任务管理器开发原理与实现
Windows任务管理器开发原理与实现
|
人工智能 Windows
恢复消失的“Windows 照片查看器“
通过编辑Windows注册表来恢复右键菜单中消失的“Windows 照片查看器”,通过添加新的字符串值来关联图片文件类型,使得“Windows 照片查看器”重新出现在右键菜单中。
989 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已成功集成。
1122 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检查是否成功。整个过程需确保环境变量设置正确,并根据路径添加相应库。
805 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开发实战:从零基础到短视频上线》。
953 4
FFmpeg开发笔记(二)搭建Windows系统的开发环境
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
915 0
|
网络安全 C++ Windows
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试