c#窗体如何让picturebox旋转
PictureBox旋转99.9%的人都搞不了的!
应该旋转的是图片
如果不是随意角度,直接用这个方法:pictureBox.Image.RotateFlip()
任意角度的话可参考下这个片断:
public static class ImageEx
{
public static Image GetRotateImage(this Image img, float angle)
{
angle = angle % 360;//弧度转换
double radian = angle * Math.PI / 180.0;
double cos = Math.Cos(radian);
double sin = Math.Sin(radian);
//原图的宽和高
int w = img.Width;
int h = img.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)));
//目标位图
Image dsImage = new Bitmap(W, H, img.PixelFormat);
using (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(360 - angle);
//恢复图像在水平和垂直方向的平移
g.TranslateTransform(-center.X, -center.Y);
g.DrawImage(img, rect);
//重至绘图的所有变换
g.ResetTransform();
g.Save();
}
return dsImage;
}
}
PS:在有上面代码后,旋转30度可以这样写:pictureBox.Image=img.GetRotateImage(30);
注意:Image用后请手动释放pictureBox.Image.Dispose();否则图片大些的话,转转下内存就猛升了(一点经验,敬请笑纳)。
补充:C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。
PictureBox旋转99.9%的人都搞不了的!
你应该旋转的是图片
如果不是随意角度,直接用这个方法:pictureBox.Image.RotateFlip()
任意角度的话可参考下这个片断:
public static class ImageEx
{
public static Image GetRotateImage(this Image img, float angle)
{
angle = angle % 360;//弧度转换
double radian = angle * Math.PI / 180.0;
double cos = Math.Cos(radian);
double sin = Math.Sin(radian);
//原图的宽和高
int w = img.Width;
int h = img.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)));
//目标位图
Image dsImage = new Bitmap(W, H, img.PixelFormat);
using (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(360 - angle);
//恢复图像在水平和垂直方向的平移
g.TranslateTransform(-center.X, -center.Y);
g.DrawImage(img, rect);
//重至绘图的所有变换
g.ResetTransform();
g.Save();
}
return dsImage;
}
}
PS:在有上面代码后,旋转30度可以这样写:pictureBox.Image=img.GetRotateImage(30);
注意:Image用后请手动释放pictureBox.Image.Dispose();否则图片大些的话,转转下内存就猛升了(一点经验,敬请笑纳)。