最近公司的一個手機項目中,要在頁面上面上傳圖片到服務器;直接調用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;
}
}