解决手机上传图片旋转问题

最近公司的一个手机项目中,要在页面上面上传图片到服务器;直接调用PC端的API的时候,居然图片会被旋转,这就让我很郁闷了,然后通过百度各种查询,才发现原来手机拍照之后图片,图片会保存一个拍照信息;在后台可以使用PropertyItems获取到图片的信息,从而判断图片是否旋转;特别注意的是,手机上传的时候,图片不能保存之后再去判断图片信息,因为保存到服务器之后图片的旋转信息就会消失。代码如下;

 

MemoryStream stream = new MemoryStream(buffer);
System.Drawing.Image img1 = System.Drawing.Image.FromStream(stream);  //base64图片信息 转换为 图片

/// <summary>
/// 手机上传图片旋转问题
/// </summary>
/// <param name="bytelist">图片的base64</param>
/// <param name="imgpath">图片信息</param>
/// <param name="savepath">图片的保存路径</param>
public void imgXuanZhuan(byte[] bytelist, Image imgpath, string savepath)
{
int rotate = readPictureDegree(imgpath);//判断图片的旋转角度
if (rotate == 90)
{
KiRotate(bytelist, RotateFlipType.Rotate90FlipNone, savepath);
}
else if (rotate == -90)
{
KiRotate(bytelist, RotateFlipType.Rotate270FlipNone, savepath);
}
else if (rotate == 180)
{
KiRotate(bytelist, RotateFlipType.Rotate180FlipNone, savepath);
}
else if (rotate == 0)
{
KiRotate(bytelist,RotateFlipType.RotateNoneFlipNone,savepath);
}
}

/// <summary>
/// 获取原图旋转角度(IOS和Android相机拍的照片)
/// </summary>
/// <param name="path">图片路径</param>
/// <returns></returns>
public static int readPictureDegree(Image path)
{
int rotate = 0;
using (var image = path)
{
foreach (var prop in image.PropertyItems)
{
if (prop.Id == 0x112)
{
if (prop.Value[0] == 6)//竖屏的也不旋转
rotate = 90;
if (prop.Value[0] == 8)
rotate = -90;
if (prop.Value[0] == 3)
rotate = 180;
prop.Value[0] = 1;
}
}
}
return rotate;
}

/// <summary>
/// 旋转
/// </summary>
/// <param name="bytelist">图片的base64</param>
/// <param name="rotateFlipType">图片类型</param>
/// <param name="path">保存路径</param>
/// <returns></returns>
public bool KiRotate(byte[] bytelist, RotateFlipType rotateFlipType, string path)
{
try
{
MemoryStream ms1 = new MemoryStream(bytelist);
using (Bitmap bitmap = (Bitmap)Image.FromStream(ms1))
{
bitmap.RotateFlip(rotateFlipType);
bitmap.Save(path);
}
return true;
}
catch (Exception ex)
{
return false;
}
}

posted @ 2019-06-11 09:55  myken  阅读(1833)  评论(0编辑  收藏  举报