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  联系我,非常感谢。

  • 相关阅读:
    LSMW TIPS
    Schedule agreement and Delfor
    Running VL10 in the background 13 Oct
    analyse idoc by creation date
    New Journey Prepare
    EDI error
    CBSN NEWS
    Listen and Write 18th Feb 2019
    Microsoft iSCSI Software Target 快照管理
    通过 Microsoft iSCSI Software Target 提供存储服务
  • 原文地址:https://www.cnblogs.com/alexis/p/2291995.html
Copyright © 2011-2022 走看看