您的位置:首页 > 其它

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

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

  

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

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




源码下载
  原文Handling
picture orientation in CameraCaptureTask in Windows Phone 7

  本文来自Alexis的博客,原文地址:/article/4705636.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐