zoukankan      html  css  js  c++  java
  • 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

    如果您喜欢我的文章,您可以通过支付宝对我进行捐助,您的支持是我最大的动力https://me.alipay.com/alexis


    作者:Alexis
    出处:http://www.cnblogs.com/alexis/
    关于作者:专注于Windows Phone 7、Silverlight、Web前端(jQuery)。
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过shuifengxuATgmail.com  联系我,非常感谢。

  • 相关阅读:
    BZOJ_2661_[BeiJing wc2012]连连看_费用流
    BZOJ_4867_[Ynoi2017]舌尖上的由乃_分块+dfs序
    BZOJ_3238_[Ahoi2013]差异_后缀自动机
    BZOJ_3207_花神的嘲讽计划Ⅰ_哈希+主席树
    [转载]快速幂与矩阵快速幂
    ACM的一点基础知识
    [转载]C++STL—vector的插入与删除
    C++STL—map的使用
    [转载]汇编语言assume伪指令的作用
    [转载]c++中的位运算符
  • 原文地址:https://www.cnblogs.com/alexis/p/2291995.html
Copyright © 2011-2022 走看看