项目场景:
对图片进行裁剪时,横着的图片裁剪正常,竖直图片裁剪失败
问题描述:
对图片进行裁剪时,横着的图片裁剪正常,竖直图片裁剪失败
代码中裁剪图片代码:
public void cutPicture(String picPath, string newPath, int x, int y, int width, int height)
{
//图片路径
String oldPath = picPath;
//定义截取矩形
System.Drawing.Rectangle cropArea = new System.Drawing.Rectangle(x, y, width, height);
//要截取的区域大小
//加载图片
System.Drawing.Image img =System.Drawing.Image.FromStream(new System.IO.MemoryStream(System.IO.File.ReadAllBytes(oldPath)));
//定义Bitmap对象
System.Drawing.Bitmap bmpImage = new System.Drawing.Bitmap(img);
//进行裁剪
System.Drawing.Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
//保存成新文件
bmpCrop.Save(newPath);
//释放对象
img.Dispose();
bmpCrop.Dispose();
}
原因分析:
图片加载的时候System.Drawing.Image.FromStream() 未进行图片旋转操作
解决方案:
新建一个根据图片exif调整方向 的方法代码如下:
/// 根据图片exif调整方向
/// </summary>
/// <param name="sm"></param>
/// <returns></returns>
public Image RotateImage(Image tmpbitmap)
{
try
{
var exif = tmpbitmap.PropertyItems;
byte orien = 0;
var item = exif.Where(m => m.Id == 274).ToArray();
if (item.Length > 0)
orien = item[0].Value[0];
switch (orien)
{
case 2:
tmpbitmap.RotateFlip(RotateFlipType.RotateNoneFlipX);//horizontal flip
break;
case 3:
tmpbitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);//right-top
break;
case 4:
tmpbitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);//vertical flip
break;
case 5:
tmpbitmap.RotateFlip(RotateFlipType.Rotate90FlipX);
break;
case 6:
tmpbitmap.RotateFlip(RotateFlipType.Rotate90FlipNone);//right-top
break;
case 7:
tmpbitmap.RotateFlip(RotateFlipType.Rotate270FlipX);
break;
case 8:
tmpbitmap.RotateFlip(RotateFlipType.Rotate270FlipNone);//left-bottom
break;
default:
break;
}
Bitmap bitmap = new Bitmap(tmpbitmap);
tmpbitmap.Dispose();
return (Image)bitmap;
}
catch (Exception E)
{
return tmpbitmap;
}
}
修改图片加载方法
RotateImage(System.Drawing.Image.FromStream(new System.IO.MemoryStream(System.IO.File.ReadAllBytes(oldPath))));