c#旋转图片并保存在本地

c#旋转图片并保存在本地

①将图片读入bitmap中

  • path为绝对路径,例:String path = @"D:/desktop/test.jpg"
Bitmap b = new Bitmap(path, true);

②旋转图片

参考:C# 图片旋转_kingwebo’sZone的博客-CSDN博客

  • 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°后。
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值