c#旋转图片并保存在本地
①将图片读入bitmap中
- path为绝对路径,例:
String path = @"D:/desktop/test.jpg"
Bitmap b = new Bitmap(path, true);
②旋转图片
- angle为角度不是弧度。
Graphics.RotateTransform(angle)
,旋转方向默认是顺时针旋转。
public static Bitmap rotateImage(Bitmap b, float angle)
{
//创建位图用于旋转图片
Bitmap returnBitmap = new Bitmap(b.Width, b.Height);
//初始化Graphics类
Graphics g = Graphics.FromImage(returnBitmap);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
//移动坐标原点到图片中心
g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);
//顺时针旋转对应angle的角度
g.RotateTransform(angle);
//移动坐标原地啊为原来的位置
g.TranslateTransform(-(float)b.Width / 2, -(float)b.Height / 2);
//构造图片
g.DrawImage(b, new System.Drawing.Point(0, 0));
//返回位图
return returnBitmap;
}
③完整代码测试
public static Bitmap rotateImage(Bitmap b, float angle)
{
//创建位图用于旋转图片
Bitmap returnBitmap = new Bitmap(b.Width, b.Height);
//初始化Graphics类
Graphics g = Graphics.FromImage(returnBitmap);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
//移动坐标原点到图片中心
g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);
//顺时针旋转对应angle的角度
g.RotateTransform(angle);
//移动坐标原地啊为原来的位置
g.TranslateTransform(-(float)b.Width / 2, -(float)b.Height / 2);
//构造图片
g.DrawImage(b, new System.Drawing.Point(0, 0));
//返回位图
return returnBitmap;
}
// ocr c#入口方法
public static void Main(string[] args)
{
Console.WriteLine(1);
Bitmap b = new Bitmap(@"D:/desktop/git-space/local_baidu_ocr2/local_baidu_ocr/local_baidu_ocr/bin/images/4.jpg", true);
Bitmap ans = rotateImage(b, 90);
ans.Save("../images/6.jpg", System.Drawing.Imaging.ImageFormat.Png);
Console.ReadLine();
}
④程序结果
- 其中4.jpg为原图,6.jpg为旋转后的结果。顺时针旋转了90°。
⑤缺陷
- 如果按照非90的倍数的角度去旋转,旋转后的结果图片会留有空白。
⑥优化
修复旋转后图片被覆盖的问题。算法:旋转后修改存储矩阵的大小。
public static Bitmap rotateImage(Bitmap b, float angle)
{
//创建位图用于旋转图片
Double tangle = angle * Math.PI/180;
Console.WriteLine(tangle);
int r = (int)Math.Sqrt((b.Width * b.Width) + (b.Height * b.Height));
int w = (int)(Math.Abs(b.Height * Math.Sin(tangle)) + Math.Abs(b.Width * Math.Cos(tangle)));
int h = (int)(Math.Abs(b.Height * Math.Cos(tangle)) + Math.Abs(b.Width * Math.Sin(tangle)));
Console.WriteLine(w);
Console.WriteLine(h);
Console.WriteLine(b.Width);
Console.WriteLine(b.Height);
Bitmap returnBitmap = new Bitmap(w, h);
//初始化Graphics类
Graphics g = Graphics.FromImage(returnBitmap);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
//移动坐标原点到图片中心
g.TranslateTransform((float)w / 2, (float)h / 2);
//顺时针旋转对应angle的角度
g.RotateTransform(angle);
//移动坐标原地到原来的位置
g.TranslateTransform(-(float)w / 2, -(float)h / 2);
//构造图片
g.DrawImage(b, new System.Drawing.Point((w-b.Width)/2, (h-b.Height)/2));
//返回位图
return returnBitmap;
}
public static void Main(string[] args)
{
Bitmap bitmap = new Bitmap(@"D:/desktop/git-space/local_baidu_ocr2/local_baidu_ocr/local_baidu_ocr/bin/images/6.jpg");
float angle = 30;
Bitmap ans = rotateImage(bitmap, angle);
ans.Save("../images/SDK.jpg", System.Drawing.Imaging.ImageFormat.Png);
}
⑦优化后结果:
旋转前:
旋转30°后。