图片自由旋转并全图显示的功能实现

       WinForms实现图片的自由旋转,主要是利用 Graphics类中的RotateTransform方法,但是在实现的时候,因为需要全图显示,需要一点数学知识(中学即可)。(这里模仿某些手机软件使用TraceBar对图片进行旋转)

        如上图所示,只要保证每次绘图时,图片大小为红色所示相框大小即可。

        已知原图宽w,高h,计算红框需要的大小W,H:(α为旋转角度)

        W = |h * cos α | + |w * sin α |

        H = |w * cos α | + |h * sin α |

详细见下面代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;


namespace FreeTrun
{
    public class FreeTrun
    {
        public static Bitmap Pfturn(Bitmap b, int angle)
        {
            //弧度转换
            double radian = angle * Math.PI / 180.0;
            double cos = Math.Cos(radian);
            double sin = Math.Sin(radian);

            //原图的宽和高
            int w = b.Width;
            int h = b.Height;
            //新图的宽和高
            int W = (int)(Math.Abs(w * cos) + Math.Abs(h * sin));  
            int H = (int)(Math.Abs(w * sin) + Math.Abs(h * cos));
            //目标位图
            Bitmap dsImage = new Bitmap(W, H);
            Graphics g = Graphics.FromImage(dsImage);       //画图类

            g.InterpolationMode = InterpolationMode.Bilinear;

            g.SmoothingMode = SmoothingMode.HighQuality;

            //计算偏移量
            Point Offset = new Point((W - w) / 2, (H - h) / 2); //图像的左上角顶点
            //构造图像显示区域:让图像的中心与窗口的中心点一致
            Rectangle rect = new Rectangle(Offset.X, Offset.Y, w, h);  
            Point center = new Point(W / 2, H / 2);     //图片中心落在画布中点
            g.TranslateTransform(center.X, center.Y);   //将图片平移到中点再化为矩阵
            g.RotateTransform(360 - angle);     //对矩阵旋转,要将顺时针变为逆时针

            //恢复图像在水平和垂直方向的平移
            g.TranslateTransform(-center.X, -center.Y);
            g.DrawImage(b, rect);   //rect为上面构造的显示区域

            //重至绘图的所有变换
            g.ResetTransform();
            g.Dispose();
            return dsImage;
        }
    }
}

 使用一个应用对其进行实验:(TraceBar的值作为旋转函数输入值即可实现)

                                                                                             原图

                                                                                                旋转一定角度

                                                                                                180°的旋转

                                                                                         旋转一个负数角度

性能不太好,但希望能有用。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值