博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows Phone实用开发技巧(32):照片角度处理
阅读量:6503 次
发布时间:2019-06-24

本文共 2817 字,大约阅读时间需要 9 分钟。

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

那么我们在客户端中应该如何处理这种情况呢?一种想法是获取图片的角度,如果是90°,就把照片翻转过来,再进行相应的操作。那这样就涉及到2个问题

1. 如何获取相册中照片的角度

2. 如何翻转已有的照片(流、或者Bitmap或者WriteableBitmap)

查看了系统的API,并没有对相片的角度提供支持,但是我们可以使用开源库去做。

下述的方法就是获取选取图片的角度的

/// /// 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;}

原文

转载于:https://www.cnblogs.com/alexis/archive/2011/12/18/2291995.html

你可能感兴趣的文章
Windows下与Linux下编写socket程序的区别
查看>>
CloudCC:智能CRM究竟能否成为下一个行业风口?
查看>>
高德开放平台推出LBS游戏行业解决方案提供专业地图平台能力支持
查看>>
追求绿色数据中心
查看>>
Web开发初学指南
查看>>
OpenStack Days China:华云数据CTO郑军分享OpenStack创新实践
查看>>
探寻光存储没落的真正原因
查看>>
高通64位ARMv8系列服务器芯片商标命名:Centriq
查看>>
中国人工智能学会通讯——融合经济学原理的个性化推荐 1.1 互联网经济系统的基本问题...
查看>>
盘点大数据商业智能的十大戒律
查看>>
戴尔为保护数据安全 推出新款服务器PowerEdge T30
查看>>
今年以来硅晶圆涨幅约达40%
查看>>
构建智能的新一代网络——专访Mellanox市场部副总裁 Gilad Shainer
查看>>
《数字视频和高清:算法和接口》一导读
查看>>
《中国人工智能学会通讯》——6.6 实体消歧技术研究
查看>>
如何在Windows查看端口占用情况及查杀进程
查看>>
一分钟秒懂公有云、私有云、混合云......
查看>>
云存储应用Upthere获7700万美元股权债务融资
查看>>
国家互联网应急中心何世平博士主题演讲
查看>>
洗茶,你误会了多少年?
查看>>