c#窗体如何让picturebox旋转

 我来答
晰美酒窝
推荐于2018-02-27 · TA获得超过6731个赞
知道大有可为答主
回答量:4544
采纳率:27%
帮助的人:1477万
展开全部

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网络框架的主角。

linsloony
推荐于2017-11-26 · TA获得超过362个赞
知道小有建树答主
回答量:212
采纳率:0%
帮助的人:279万
展开全部

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();否则图片大些的话,转转下内存就猛升了(一点经验,敬请笑纳)。

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式