边界在旋转时切割图像

时间:2013-08-26 11:20:42

标签: c# rotation system.drawing

我想在图片框中旋转图像。这是我的代码。

public static Bitmap RotateImage(Image image, PointF offset, float angle)
        {
            if (image == null)
            {
                throw new ArgumentNullException("image");
            }
            var rotatedBmp = new Bitmap(image.Width, image.Height);
            rotatedBmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);

            var g = Graphics.FromImage(rotatedBmp);

            g.TranslateTransform(offset.X, offset.Y);

            g.RotateTransform(angle);

            g.TranslateTransform(-offset.X, -offset.Y);

            g.DrawImage(image, new PointF(0, 0));

            return rotatedBmp;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Image image = new Bitmap(pictureBox1.Image);
            pictureBox1.Image = (Bitmap)image.Clone();
            var oldImage = pictureBox1.Image;
            var p = new Point(image.Width / 2, image.Height);
            pictureBox1.Image = null;
            pictureBox1.Image = RotateImage(image, p, 1);
            pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
            pictureBox1.Refresh();
            if (oldImage != null)
            {
                oldImage.Dispose();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Image image = new Bitmap(pictureBox1.Image);
            pictureBox1.Image = (Bitmap)image.Clone();
            var oldImage = pictureBox1.Image;
            var p = new Point(image.Width / 2, image.Height);
            pictureBox1.Image = null;
            pictureBox1.Image = RotateImage(image, p, -1);
            pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
            pictureBox1.Refresh();
            if (oldImage != null)
            {
                oldImage.Dispose();
            }
        }

现在的问题是,当我旋转图像时,它会被剪切掉。情况就是这样。 enter image description here

我已经拉伸了图片框并改变了表单的颜色,只是为了清晰的图片。 我的问题是我何时使用了声明

 pictureBox1.Image = RotateImage(image, p, 1);

那么为什么在postion之后图片没有正确,因为这是我们必须将一些图像分配给groupbox的任何情况所使用的相同语句。为什么不在这里工作?我之前搜索过它,但大多数搜索似乎与我无关,因为它们使用的旋转功能可以旋转90,180,270。但我希望旋转一定程度,最高可达10度。

2 个答案:

答案 0 :(得分:0)

默认情况下不支持轮播Controls(链接谈论此内容:link1link2)。图片被剪切的原因是,在旋转之后,其宽度大于pictureBox1;因此,快速解决方案是在轮换后更新其大小:

pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize; //Adapts the size automatically

pictureBox1.Width = image.Width;
pictureBox1.Height = image.Height;

这应该是一个可接受的解决方案(无论如何都必须有足够的可用空间来考虑图像的新尺寸)。另一个选项是直接影响PictureBox控件(例如,通过影响定义其边界的矩形)会更加困难。

答案 1 :(得分:0)

我已经知道win Forms不适用于任何转换和旋转。将模式更改为AutoSize并没有什么不同。轮换和转换的最佳选择是WPF
 WPF有一个很好的转换类,可以在不影响对象的情况下旋转和转换对象。物体不会模糊 您可以使用This进行旋转和转换。