我想在图片框中旋转图像。这是我的代码。
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();
}
}
现在的问题是,当我旋转图像时,它会被剪切掉。情况就是这样。
我已经拉伸了图片框并改变了表单的颜色,只是为了清晰的图片。 我的问题是我何时使用了声明
pictureBox1.Image = RotateImage(image, p, 1);
那么为什么在postion之后图片没有正确,因为这是我们必须将一些图像分配给groupbox的任何情况所使用的相同语句。为什么不在这里工作?我之前搜索过它,但大多数搜索似乎与我无关,因为它们使用的旋转功能可以旋转90,180,270。但我希望旋转一定程度,最高可达10度。
答案 0 :(得分:0)
默认情况下不支持轮播Controls
(链接谈论此内容:link1,link2)。图片被剪切的原因是,在旋转之后,其宽度大于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进行旋转和转换。