C#实现任意角度旋转图片(方法2)

C#实现Windows图片查看器的旋转功能:

[c-sharp] view plaincopy
  1. private const string IMAGEFILE = "FocusPoint.JPG";  
  2.   
  3.    private static int MyAngle = 0; //旋转角度[-360,360]  
  4.   
  5.   
  6.   
  7.    private void Page_Load(object sender, EventArgs e)  
  8.   
  9.    {  
  10.   
  11.    Image img;  
  12.   
  13.    FileStream fs;  
  14.   
  15.   
  16.    fs = new FileStream(IMAGEFILE, FileMode.Open, FileAccess.Read);  
  17.   
  18.    img = Bitmap.FromStream(fs);  
  19.   
  20.    fs.Close();  
  21.   
  22.    pictureBox1.Image = img;  
  23.   
  24.    }  
  25.   
  26.   
  27.   
  28.    private void button1_Click(object sender, EventArgs e)  
  29.   
  30.    {  
  31.   
  32.    MyAngle = 90;  
  33.   
  34.    //MyAngle += 90;  
  35.   
  36.    //if (MyAngle > 360) MyAngle = 90;  
  37.   
  38.    pictureBox1.Image = RotateImg(GetSourceImg(IMAGEFILE), MyAngle);  
  39.   
  40.    }  
  41.   
  42.   
  43.    private void button2_Click(object sender, EventArgs e)  
  44.   
  45.    {  
  46.   
  47.    MyAngle = -90;  
  48.   
  49.    //MyAngle += -90;  
  50.   
  51.    //if (MyAngle < -360) MyAngle = -90;  
  52.   
  53.    //pictureBox1.Image = RotateImg(Bitmap.FromFile(IMAGEFILE), MyAngle);  
  54.   
  55.    pictureBox1.Image = RotateImg(IMAGEFILE, MyAngle);  
  56.   
  57.    }  
  58.  
  59.  
  60.    #region 图片旋转函数  
  61.   
  62.   
  63.    /// <summary>  
  64.   
  65.    /// 以逆时针为方向对图像进行旋转  
  66.   
  67.    /// </summary>  
  68.   
  69.    /// <param name="b">位图流</param>  
  70.   
  71.    /// <param name="angle">旋转角度[0,360](前台给的)</param>  
  72.   
  73.    /// <returns></returns>  
  74.   
  75.    public Image RotateImg(Image b, int angle)  
  76.   
  77.    {  
  78.   
  79.    angle = angle % 360;  
  80.   
  81.   
  82.    //弧度转换  
  83.   
  84.    double radian = angle * Math.PI / 180.0;  
  85.   
  86.    double cos = Math.Cos(radian);  
  87.   
  88.    double sin = Math.Sin(radian);  
  89.   
  90.   
  91.    //原图的宽和高  
  92.   
  93.    int w = b.Width;  
  94.   
  95.    int h = b.Height;  
  96.   
  97.    int W = (int)(Math.Max(Math.Abs(w * cos - h * sin), Math.Abs(w * cos + h * sin)));  
  98.   
  99.    int H = (int)(Math.Max(Math.Abs(w * sin - h * cos), Math.Abs(w * sin + h * cos)));  
  100.   
  101.   
  102.    //目标位图  
  103.   
  104.    Bitmap dsImage = new Bitmap(W, H);  
  105.   
  106.    System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(dsImage);  
  107.   
  108.    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;  
  109.   
  110.    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;  
  111.   
  112.   
  113.    //计算偏移量  
  114.   
  115.    Point Offset = new Point((W - w) / 2, (H - h) / 2);  
  116.   
  117.   
  118.    //构造图像显示区域:让图像的中心与窗口的中心点一致  
  119.   
  120.    Rectangle rect = new Rectangle(Offset.X, Offset.Y, w, h);  
  121.   
  122.    Point center = new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2);  
  123.   
  124.   
  125.    g.TranslateTransform(center.X, center.Y);  
  126.   
  127.    g.RotateTransform(360 - angle);  
  128.   
  129.   
  130.    //恢复图像在水平和垂直方向的平移  
  131.   
  132.    g.TranslateTransform(-center.X, -center.Y);  
  133.   
  134.    g.DrawImage(b, rect);  
  135.   
  136.   
  137.    //重至绘图的所有变换  
  138.   
  139.    g.ResetTransform();  
  140.   
  141.   
  142.    g.Save();  
  143.   
  144.    g.Dispose();  
  145.   
  146.    //保存旋转后的图片  
  147.   
  148.    b.Dispose();  
  149.   
  150.    dsImage.Save("FocusPoint.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);  
  151.   
  152.    return dsImage;  
  153.   
  154.    }  
  155.   
  156.   
  157.    public Image RotateImg(string filename, int angle)  
  158.   
  159.    {  
  160.   
  161.    return RotateImg(GetSourceImg(filename), angle);  
  162.   
  163.    }  
  164.   
  165.   
  166.    public Image GetSourceImg(string filename)  
  167.   
  168.    {  
  169.   
  170.    Image img;  
  171.   
  172.      
  173.   
  174.    img = Bitmap.FromFile(filename);  
  175.   
  176.   
  177.    return img;  
  178.   
  179.    }  
  180.  
  181.  
  182.    #endregion 图片旋转函数  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值