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°的旋转
旋转一个负数角度
性能不太好,但希望能有用。