Windows Phone实用开发技巧(32):照片角度处理
在实际项目中,可能需要用户从相册中选择图片然后进行相应的处理。但是不知道大家有没有发现这样一种情况,就是手机里看是竖着的,但是上传到微博或者哪里的时候确实横着的。一种情况是你拿手机竖着拍照得话,照片就是横着的,虽然在手机里看是竖着的。(可能有点抽象,遇到此情况的同学应该深有感触)
那么我们在客户端中应该如何处理这种情况呢?一种想法是获取图片的角度,如果是90°,就把照片翻转过来,再进行相应的操作。那这样就涉及到2个问题
1. 如何获取相册中照片的角度
2. 如何翻转已有的照片(流、或者bitmap或者writeablebitmap)
查看了的api,并没有对相片的角度提供支持,但是我们可以使用aspx" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(255, 102, 0); text-decoration: none; ">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
作者:alexis
推荐阅读
-
Windows Phone实用开发技巧(32):照片角度处理
-
Windows Phone实用开发技巧(31):密码加密
-
Windows Phone 实用开发技巧(29):动态绑定Pivot
-
Windows Phone实用开发技巧(32):照片角度处理
-
Windows Phone实用开发技巧(33):不重启程序切换当前语言
-
Windows Phone 实用开发技巧(2):使用TombstoneHelper简化墓碑操作
-
Windows Phone实用开发技巧(1):保存图片及加载图片
-
Windows Phone 实用开发技巧(17):自定义应用程序的Tile
-
Windows Phone 实用开发技巧(3):输入框自动聚焦并打开SIP
-
Windows Phone 实用开发技巧(25):Windows Phone读取本地数据