List<Point> point = new List<Point>();//存储鼠标点击位置的坐标
//双击图片获取鼠标当前坐标
private void pictureBox1_DoubleClick(object sender, EventArgs e){
Point mouseposition = Control.MousePosition;
point.Add(mouseposition);
}
private void button2_Click(object sender, EventArgs e)
{
double x1 = point[0].X;
double y1 = point[0].Y;
double x2 = point[1].X;
double y2 = point[1].Y ;
double tanx;
tanx =(-1)* (y2 - y1) / (x2 - x1);//通过前后获取的两个点计算需旋转夹角的tanx值
double a = Math.Atan(tanx );//计算角度值
double angle1 = 180 * a / Math.PI;//将其转换为角度
double angle2 =180-((-1)*( 180 * a / Math.PI));
Bitmap map = new Bitmap(pictureBox1.Image);
if (y2 >y1 )//角度小于90度时
pictureBox1.Image = Rotate(map, angle1 );
else//角度在90—180度之间则进行反向旋转
pictureBox1.Image = Rotate(map, angle2);
pictureBox1.Refresh();//最后刷新图片框
point.Clear();
}
public Bitmap Rotate(Bitmap b, double angle)
{
angle = angle % 360;
//弧度转换
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.Max(Math.Abs(w * cos - h * sin), Math.Abs(w * cos + h * sin)));
int H = (int)(Math.Max(Math.Abs(w * sin - h * cos), Math.Abs(w * sin + h * cos)));
//目标位图
Bitmap dsImage = new Bitmap(W, H);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(dsImage);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;
g.SmoothingMode = System.Drawing.Drawing2D.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(rect.X + rect.Width / 2, rect.Y + rect.Height / 2);
g.TranslateTransform(center.X, center.Y);
g.RotateTransform(float.Parse(angle.ToString ()));
//恢复图像在水平和垂直方向的平移
g.TranslateTransform(-center.X, -center.Y);
g.DrawImage(b, rect);
//重至绘图的所有变换
g.ResetTransform();
g.Save();
g.Dispose();
return dsImage;
}