Image.RotateFlip 似乎没有旋转位图
Image.RotateFlip doesn't seem to rotate the Bitmap
我有三个带有齿轮图像的 PictureBox(post 中的图片)。
当我将鼠标悬停在它们上面时,它们会旋转。我正在使用 System.Drawing.Image.RotateFlip(RotateFlipType)
.
看起来只有齿轮的中心在旋转,而边缘是静止的。
private void rotationTimer_Tick(object sender, EventArgs e)
{
Image flipImage = pictureBox1.Image;
flipImage.RotateFlip(RotateFlipType.Rotate90FlipXY);
pictureBox1.Image = flipImage;
}
private void rotationTimer2_Tick(object sender, EventArgs e)
{
Image flipImage = pictureBox2.Image;
flipImage.RotateFlip(RotateFlipType.Rotate90FlipNone);
pictureBox2.Image = flipImage;
}
private void rotationTimer3_Tick(object sender, EventArgs e)
{
Image flipImage = pictureBox3.Image;
flipImage.RotateFlip(RotateFlipType.Rotate270FlipXY);
pictureBox3.Image = flipImage;
}
private void pictureBox1_MouseHover(object sender, EventArgs e)
{
rotationTimer.Start();
rotationTimer2.Start();
rotationTimer3.Start();
} //etc...
这是使用 Matrix.RotateAt() 方法旋转图像的示例。
这是一个非常简单的过程:
- 从图像文件(或项目资源)创建位图对象;请注意位图是 [Cloned][2]:这样,我们将它从 FileStream 中分离出来(GDI+ 不会在使用时锁定文件)。当你完成它(或应用程序关闭)时记得Dispose()
- 定义适合图像形状的旋转角度
- 设置生成旋转速度(结合旋转角度)的定时器间隔。我们也在使用 System.Windows.Form.Timer of course: we want it to tick in the UI thread (note that this object needs to be Disposed)
- 当计时器计时时,Invalidate() canvas(这里是 PictureBox 控件)
- 使用
Matrix.RotateAt(gearCurrentRotationAngle, [ImageCentre])
并应用 Matrix to the Graphics geometric world transformation using its Transform 属性
- 在每次旋转时将选择的旋转角度添加到当前旋转角度。当它达到 360 度时,重新设置为最小值(
gearRotationAngle
字段值,此处)
这里还有一些其他例子:
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
Bitmap gear = null;
RectangleF gearRect = Rectangle.Empty;
int gearRotateSpeed = 100;
int gearRotationAngle = 24;
int gearCurrentRotationAngle = 0;
System.Windows.Forms.Timer gearTimer = new System.Windows.Forms.Timer();
public Form1() {
InitializeComponent();
gear = Image.FromStream(new MemoryStream(File.ReadAllBytes(@"File Path")));
// Assuming the Gear Image is square shaped and the PictureBox size remains constant
// otherwise, recalculate in the Control.Resize event
var gearScale = Math.Min(pictureBox1.Width, pictureBox1.Height) / (float)Gear.Width;
var gearSize = new SizeF(gear.Width * gearScale, gear.Height * gearScale);
gearRect = new RectangleF(new PointF((pictureBox1.Width - gearSize.Width) / 2.0f, (pictureBox1.Height - gearSize.Height) / 2.0f), gearSize);
gearTimer.Tick += (s, e) => {
gearCurrentRotationAngle += gearRotationAngle;
if (gearCurrentRotationAngle > 360) gearCurrentRotationAngle = gearRotationAngle;
pictureBox1.Invalidate();
}
}
private void pictureBox1_MouseEnter(object sender, EventArgs e) {
gearTimer.Interval = gearRotateSpeed;
gearTimer.Start();
}
private void pictureBox1_MouseLeave(object sender, EventArgs e) => gearTimer.Stop();
private void pictureBox1_Paint(object sender, PaintEventArgs e) {
var canvas = sender as PictureBox;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.PixelOffsetMode = PixelOffsetMode.Half;
PointF centerImage = new PointF(canvas.Width / 2, canvas.Height / 2);
using (var mx = new Matrix()) {
mx.RotateAt(gearCurrentRotationAngle, centerImage);
e.Graphics.Transform = mx;
e.Graphics.DrawImage(gear, gearRect);
}
}
我有三个带有齿轮图像的 PictureBox(post 中的图片)。
当我将鼠标悬停在它们上面时,它们会旋转。我正在使用 System.Drawing.Image.RotateFlip(RotateFlipType)
.
看起来只有齿轮的中心在旋转,而边缘是静止的。
private void rotationTimer_Tick(object sender, EventArgs e)
{
Image flipImage = pictureBox1.Image;
flipImage.RotateFlip(RotateFlipType.Rotate90FlipXY);
pictureBox1.Image = flipImage;
}
private void rotationTimer2_Tick(object sender, EventArgs e)
{
Image flipImage = pictureBox2.Image;
flipImage.RotateFlip(RotateFlipType.Rotate90FlipNone);
pictureBox2.Image = flipImage;
}
private void rotationTimer3_Tick(object sender, EventArgs e)
{
Image flipImage = pictureBox3.Image;
flipImage.RotateFlip(RotateFlipType.Rotate270FlipXY);
pictureBox3.Image = flipImage;
}
private void pictureBox1_MouseHover(object sender, EventArgs e)
{
rotationTimer.Start();
rotationTimer2.Start();
rotationTimer3.Start();
} //etc...
这是使用 Matrix.RotateAt() 方法旋转图像的示例。
这是一个非常简单的过程:
- 从图像文件(或项目资源)创建位图对象;请注意位图是 [Cloned][2]:这样,我们将它从 FileStream 中分离出来(GDI+ 不会在使用时锁定文件)。当你完成它(或应用程序关闭)时记得Dispose()
- 定义适合图像形状的旋转角度
- 设置生成旋转速度(结合旋转角度)的定时器间隔。我们也在使用 System.Windows.Form.Timer of course: we want it to tick in the UI thread (note that this object needs to be Disposed)
- 当计时器计时时,Invalidate() canvas(这里是 PictureBox 控件)
- 使用
Matrix.RotateAt(gearCurrentRotationAngle, [ImageCentre])
并应用 Matrix to the Graphics geometric world transformation using its Transform 属性 - 在每次旋转时将选择的旋转角度添加到当前旋转角度。当它达到 360 度时,重新设置为最小值(
gearRotationAngle
字段值,此处)
这里还有一些其他例子:
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
Bitmap gear = null;
RectangleF gearRect = Rectangle.Empty;
int gearRotateSpeed = 100;
int gearRotationAngle = 24;
int gearCurrentRotationAngle = 0;
System.Windows.Forms.Timer gearTimer = new System.Windows.Forms.Timer();
public Form1() {
InitializeComponent();
gear = Image.FromStream(new MemoryStream(File.ReadAllBytes(@"File Path")));
// Assuming the Gear Image is square shaped and the PictureBox size remains constant
// otherwise, recalculate in the Control.Resize event
var gearScale = Math.Min(pictureBox1.Width, pictureBox1.Height) / (float)Gear.Width;
var gearSize = new SizeF(gear.Width * gearScale, gear.Height * gearScale);
gearRect = new RectangleF(new PointF((pictureBox1.Width - gearSize.Width) / 2.0f, (pictureBox1.Height - gearSize.Height) / 2.0f), gearSize);
gearTimer.Tick += (s, e) => {
gearCurrentRotationAngle += gearRotationAngle;
if (gearCurrentRotationAngle > 360) gearCurrentRotationAngle = gearRotationAngle;
pictureBox1.Invalidate();
}
}
private void pictureBox1_MouseEnter(object sender, EventArgs e) {
gearTimer.Interval = gearRotateSpeed;
gearTimer.Start();
}
private void pictureBox1_MouseLeave(object sender, EventArgs e) => gearTimer.Stop();
private void pictureBox1_Paint(object sender, PaintEventArgs e) {
var canvas = sender as PictureBox;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.PixelOffsetMode = PixelOffsetMode.Half;
PointF centerImage = new PointF(canvas.Width / 2, canvas.Height / 2);
using (var mx = new Matrix()) {
mx.RotateAt(gearCurrentRotationAngle, centerImage);
e.Graphics.Transform = mx;
e.Graphics.DrawImage(gear, gearRect);
}
}