Windows 形式的旋转图像 (C#)
Spinning Image in Windows Forms (C#)
我在音乐播放器中工作,我希望当前歌曲的专辑封面在圆形图片框中旋转,只是一个 vynil 转盘。
我已经有了圆形的picturebox,我试过让它旋转,但是旋转很粗,看起来不流畅。所以我不知道是我使用了错误的参数还是我的代码有问题。
此处使用的代码:
Rotating image around center C#
希望能帮到你。提前致谢。
WinForms 图形化 API 非常有限,这就是整个平台过时的原因。 WPF 更适合图形表示,因为它背后有硬件加速和 DirectX。
我的意见是,如果您要创建有趣的解决方案,请至少使用 WPF。如果您的目标是纯粹的业务,那么 WinForms 就足够了。
PictureBox 大小为 150x150,图像大小为 200x200,这对我来说真的很流畅:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private int Angle;
private Image Art; // you may need to resample larger images to a smaller image dynamically!
private int AngleStep = 20;
private System.Drawing.Drawing2D.GraphicsPath Vinyl = new System.Drawing.Drawing2D.GraphicsPath();
private void Form1_Load(object sender, EventArgs e)
{
timer1.Interval = 50;
Art = Properties.Resources.AlbumArt2; // image as embedded resource (or from somewhere else)
// larger circle with the center cut out: (like a vinyl record)
Vinyl.AddEllipse(pictureBox1.ClientRectangle);
Rectangle rc = new Rectangle(pictureBox1.Width / 2, pictureBox1.Height / 2, 1, 1);
rc.Inflate(10, 10);
Vinyl.AddEllipse(rc);
pictureBox1.Paint += PictureBox1_Paint;
}
private void PictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics G = e.Graphics;
G.SetClip(Vinyl);
G.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2); // move to the center
G.RotateTransform(Angle); // rotate to the current angle
G.DrawImage(Art, new Point(-(Art.Width / 2), -(Art.Height / 2))); // draw the image centered
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = !timer1.Enabled;
}
private void timer1_Tick(object sender, EventArgs e)
{
Angle = Angle + AngleStep;
if (Angle >= 360)
{
Angle = Angle - 360;
}
pictureBox1.Refresh();
}
}
试用一下,看看它是否适合您。您肯定需要从那些较大的图像中制作出动态的较小图像。如果您想要性能图形和动画,请按照 DighadsFerke 的建议移动到 WPF。
我在音乐播放器中工作,我希望当前歌曲的专辑封面在圆形图片框中旋转,只是一个 vynil 转盘。
我已经有了圆形的picturebox,我试过让它旋转,但是旋转很粗,看起来不流畅。所以我不知道是我使用了错误的参数还是我的代码有问题。
此处使用的代码: Rotating image around center C#
希望能帮到你。提前致谢。
WinForms 图形化 API 非常有限,这就是整个平台过时的原因。 WPF 更适合图形表示,因为它背后有硬件加速和 DirectX。 我的意见是,如果您要创建有趣的解决方案,请至少使用 WPF。如果您的目标是纯粹的业务,那么 WinForms 就足够了。
PictureBox 大小为 150x150,图像大小为 200x200,这对我来说真的很流畅:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private int Angle;
private Image Art; // you may need to resample larger images to a smaller image dynamically!
private int AngleStep = 20;
private System.Drawing.Drawing2D.GraphicsPath Vinyl = new System.Drawing.Drawing2D.GraphicsPath();
private void Form1_Load(object sender, EventArgs e)
{
timer1.Interval = 50;
Art = Properties.Resources.AlbumArt2; // image as embedded resource (or from somewhere else)
// larger circle with the center cut out: (like a vinyl record)
Vinyl.AddEllipse(pictureBox1.ClientRectangle);
Rectangle rc = new Rectangle(pictureBox1.Width / 2, pictureBox1.Height / 2, 1, 1);
rc.Inflate(10, 10);
Vinyl.AddEllipse(rc);
pictureBox1.Paint += PictureBox1_Paint;
}
private void PictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics G = e.Graphics;
G.SetClip(Vinyl);
G.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2); // move to the center
G.RotateTransform(Angle); // rotate to the current angle
G.DrawImage(Art, new Point(-(Art.Width / 2), -(Art.Height / 2))); // draw the image centered
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = !timer1.Enabled;
}
private void timer1_Tick(object sender, EventArgs e)
{
Angle = Angle + AngleStep;
if (Angle >= 360)
{
Angle = Angle - 360;
}
pictureBox1.Refresh();
}
}
试用一下,看看它是否适合您。您肯定需要从那些较大的图像中制作出动态的较小图像。如果您想要性能图形和动画,请按照 DighadsFerke 的建议移动到 WPF。