是否可以将绘图旋转到其定义的一半?
Is it possible to rotate a drawing half-way its definition?
我正在做一些重复的抽奖,每个抽奖都需要大量的工作。
我需要做的是将绘图旋转到其定义的一半,如下所示:
using (Graphics g = Graphics.FromImage(bmp))
{
//define area do pictureBox e preenche a branco
Brush brush = new SolidBrush(Color.White);
Rectangle area = new Rectangle(0, 0, 520, 520);
g.FillRectangle(brush, area);
//rotate
g.RotateTransform(some angle, some reference point)
//draw some more lines on the top of the rotated previous ones.
}
我尝试使用 g.RotateTransform(90)
因为 Winforms 中有这个功能,但它没有改变任何东西。为什么??
有什么建议吗?
编辑:如果有帮助,我只需要旋转固定角度,180º
RotateTransform
当然会改变 后续 绘图。
请注意,您通常需要一个 TranslateTransform
才能设置旋转点。但它“它没有改变任何东西”肯定是错误的。再试一次!是的,您可以在任何点旋转(或缩放或移动),然后 move/turn 返回或完全重置 Graphics
对象。
是的,了解 Matrix
和 MultiplyTransform
也很有帮助..
但是:您需要了解 Graphics
对象不 包含 任何图形,这是一个常见的误解!它是 在 Bitmap
上 绘图的工具,最常见的是 Control
的表面。所以旋转 将 发生,但仅适用于你绘制的东西 after:
private void panel1_Paint(object sender, PaintEventArgs e)
{
Rectangle rect = new Rectangle(25, 25, 25, 25);
e.Graphics.TranslateTransform(25, 25);
e.Graphics.FillRectangle(Brushes.Red, rect);
for (int i = 0; i < 15; i++)
{
rect.Inflate(2, 2);
e.Graphics.TranslateTransform(5, 2);
e.Graphics.RotateTransform(2.5f);
e.Graphics.DrawRectangle(Pens.Blue, rect);
}
}
试试这个:
使用这些参考文献:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
我制作了 windows 应用程序并放置了 form1 图片框然后这是 form_load 中的代码:
//Load an image in from a file
Bitmap pImage = new Bitmap(Environment.CurrentDirectory + @"\Image.bmp", true);
//Set our picture box to that image
pictureBox1.Image = (Bitmap)pImage.Clone();
//Store our old image so we can delete it
Image oldImage = pictureBox1.Image;
//Pass in our original image and return a new image rotated 35 degrees right
pictureBox1.Image = RotateImage(pImage, 270);
if (oldImage != null)
{
oldImage.Dispose();
}
然后用图像和旋转角度参数制作静态函数 return 旋转图像并从 form_load 调用它,如前所述:
if (image == null)
{
throw new ArgumentNullException("image");
}
else
{
//create a new empty bitmap to hold rotated image
Bitmap rotatedBmp = new Bitmap(image.Width, image.Height);
rotatedBmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
//make a graphics object from the empty bitmap
Graphics g = Graphics.FromImage(rotatedBmp);
//move rotation point to center of image
g.TranslateTransform((float)image.Width / 2, (float)image.Height / 2);
//rotate
g.RotateTransform(angle);
//move image back
g.TranslateTransform(-(float)image.Width / 2, -(float)image.Height / 2);
//draw passed in image onto graphics object
g.DrawImage(image, new PointF(0, 0));
return rotatedBmp;
}
您也可以直接使用 form_load 中的代码,方法是使用现成的 RotateFlipType(枚举类型),但是它具有固定角度,例如 90,270,....但是之前的方法您可以使用任何整数值来旋转图片 :
private void Form1_Load(object sender, EventArgs e)
{
//Load an image in from a file
Bitmap pImage = new Bitmap(Environment.CurrentDirectory + @"\Image.bmp", true);
pImage.RotateFlip(RotateFlipType.Rotate90FlipXY);
pictureBox1.Image = pImage;
}
我正在做一些重复的抽奖,每个抽奖都需要大量的工作。 我需要做的是将绘图旋转到其定义的一半,如下所示:
using (Graphics g = Graphics.FromImage(bmp))
{
//define area do pictureBox e preenche a branco
Brush brush = new SolidBrush(Color.White);
Rectangle area = new Rectangle(0, 0, 520, 520);
g.FillRectangle(brush, area);
//rotate
g.RotateTransform(some angle, some reference point)
//draw some more lines on the top of the rotated previous ones.
}
我尝试使用 g.RotateTransform(90)
因为 Winforms 中有这个功能,但它没有改变任何东西。为什么??
有什么建议吗?
编辑:如果有帮助,我只需要旋转固定角度,180º
RotateTransform
当然会改变 后续 绘图。
请注意,您通常需要一个 TranslateTransform
才能设置旋转点。但它“它没有改变任何东西”肯定是错误的。再试一次!是的,您可以在任何点旋转(或缩放或移动),然后 move/turn 返回或完全重置 Graphics
对象。
是的,了解 Matrix
和 MultiplyTransform
也很有帮助..
但是:您需要了解 Graphics
对象不 包含 任何图形,这是一个常见的误解!它是 在 Bitmap
上 绘图的工具,最常见的是 Control
的表面。所以旋转 将 发生,但仅适用于你绘制的东西 after:
private void panel1_Paint(object sender, PaintEventArgs e)
{
Rectangle rect = new Rectangle(25, 25, 25, 25);
e.Graphics.TranslateTransform(25, 25);
e.Graphics.FillRectangle(Brushes.Red, rect);
for (int i = 0; i < 15; i++)
{
rect.Inflate(2, 2);
e.Graphics.TranslateTransform(5, 2);
e.Graphics.RotateTransform(2.5f);
e.Graphics.DrawRectangle(Pens.Blue, rect);
}
}
试试这个: 使用这些参考文献:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
我制作了 windows 应用程序并放置了 form1 图片框然后这是 form_load 中的代码:
//Load an image in from a file
Bitmap pImage = new Bitmap(Environment.CurrentDirectory + @"\Image.bmp", true);
//Set our picture box to that image
pictureBox1.Image = (Bitmap)pImage.Clone();
//Store our old image so we can delete it
Image oldImage = pictureBox1.Image;
//Pass in our original image and return a new image rotated 35 degrees right
pictureBox1.Image = RotateImage(pImage, 270);
if (oldImage != null)
{
oldImage.Dispose();
}
然后用图像和旋转角度参数制作静态函数 return 旋转图像并从 form_load 调用它,如前所述:
if (image == null)
{
throw new ArgumentNullException("image");
}
else
{
//create a new empty bitmap to hold rotated image
Bitmap rotatedBmp = new Bitmap(image.Width, image.Height);
rotatedBmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
//make a graphics object from the empty bitmap
Graphics g = Graphics.FromImage(rotatedBmp);
//move rotation point to center of image
g.TranslateTransform((float)image.Width / 2, (float)image.Height / 2);
//rotate
g.RotateTransform(angle);
//move image back
g.TranslateTransform(-(float)image.Width / 2, -(float)image.Height / 2);
//draw passed in image onto graphics object
g.DrawImage(image, new PointF(0, 0));
return rotatedBmp;
}
您也可以直接使用 form_load 中的代码,方法是使用现成的 RotateFlipType(枚举类型),但是它具有固定角度,例如 90,270,....但是之前的方法您可以使用任何整数值来旋转图片 :
private void Form1_Load(object sender, EventArgs e)
{
//Load an image in from a file
Bitmap pImage = new Bitmap(Environment.CurrentDirectory + @"\Image.bmp", true);
pImage.RotateFlip(RotateFlipType.Rotate90FlipXY);
pictureBox1.Image = pImage;
}