我是Windows Forms的新手,在我的项目中,我需要在运行时更改图片框中的图像。我可以借助计时器来做到这一点。图片刚刚改变。是否有可能在图像变化时进行一些过渡,例如淡入,淡出,模糊等。如果可能,请告诉我如何操作。我在网上搜索但是徒劳。谢谢。
Varun的
答案 0 :(得分:4)
只需获取新的代码文件并将代码粘贴到其中
即可类似问题的原始答案,答案来自another question
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
public class BlendPanel : Panel
{
private Image mImg1;
private Image mImg2;
private float mBlend;
public BlendPanel()
{
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);
}
public Image Image1
{
get { return mImg1; }
set { mImg1 = value; Invalidate(); }
}
public Image Image2
{
get { return mImg2; }
set { mImg2 = value; Invalidate(); }
}
public float Blend
{
get { return mBlend; }
set { mBlend = value; Invalidate(); }
}
protected override void OnPaint(PaintEventArgs e)
{
if (mImg1 == null || mImg2 == null)
e.Graphics.FillRectangle(new SolidBrush(this.BackColor), new Rectangle(0, 0, this.Width, this.Height));
else
{
Rectangle rc = new Rectangle(0, 0, this.Width, this.Height);
ColorMatrix cm = new ColorMatrix();
ImageAttributes ia = new ImageAttributes();
cm.Matrix33 = mBlend;
ia.SetColorMatrix(cm);
e.Graphics.DrawImage(mImg2, rc, 0, 0, mImg2.Width, mImg2.Height, GraphicsUnit.Pixel, ia);
cm.Matrix33 = 1F - mBlend;
ia.SetColorMatrix(cm);
e.Graphics.DrawImage(mImg1, rc, 0, 0, mImg1.Width, mImg1.Height, GraphicsUnit.Pixel, ia);
}
base.OnPaint(e);
}
}
构建您的项目。您现在可以将BlendPanel从工具箱顶部拖放到表单上。这是一个使用它的示例程序:
private float mBlend;
private int mDir = 1;
public int count = 0;
public Bitmap[] pictures;
public void myPhoto()
{
pictures = new Bitmap[9];
pictures[0] = new Bitmap(@"Library Images\cf3.jpg");
pictures[1] = new Bitmap(@"Library Images\cf4.jpg");
pictures[2] = new Bitmap(@"Library Images\l1.JPG");
pictures[3] = new Bitmap(@"Library Images\l2.JPG");
pictures[4] = new Bitmap(@"Library Images\l3.JPG");
pictures[5] = new Bitmap(@"Library Images\l4.JPG");
pictures[6] = new Bitmap(@"Library Images\l5.JPG");
pictures[7] = new Bitmap(@"Library Images\l6.JPG");
pictures[8] = new Bitmap(@"Library Images\l7.JPG");
timer1.Interval = 50; //time of transition
timer1.Tick += BlendTick;
try
{
blendPanel1.Image1 = pictures[count];
blendPanel1.Image2 = pictures[++count];
}
catch
{
}
timer1.Enabled = true;
}
private void BlendTick(object sender, EventArgs e)
{
mBlend += mDir * 0.02F;
if (mBlend > 1)
{
mBlend = 0.0F;
if ((count + 1) < pictures.Length)
{
blendPanel1.Image1 = pictures[count];
blendPanel1.Image2 = pictures[++count];
}
else
{
blendPanel1.Image1 = pictures[count];
blendPanel1.Image2 = pictures[0];
count = 0;
}
}
blendPanel1.Blend = mBlend;
}
您需要修改new Bitmap(@"yourimagePath");
来电。建立并运行。您应该看到显示的图像从第一张图像平滑变换到第二张图像而没有任何闪烁。
我希望它有助于其他......
答案 1 :(得分:1)
此类效果没有内置支持,但您可以实现它们。我建议编写一个自定义控件来渲染图像并使用淡入淡出交换方法,使用.NET Graphics类进行alpha-blending绘图可以实现淡入淡出。
但是,Graphics类不是很快,我不建议将此技术用于大图像。如果你需要一些带有加速效果的花哨UI,请看看WPF。
答案 2 :(得分:1)
使用ColorMatrix类很容易实现混合效果。我在this thread的答案中提供了一个很好的例子。
获得模糊的一种简单方法是调整图像大小,使其变小,然后重新绘制,使其变大。 Graphics.InterpolationMode属性会影响您将获得的模糊类型。
这些是快速自己动手的解决方案。任何体面的图形库都内置了这些操作。你可能想要一些免费的东西,看看ImageMagick.NET
答案 3 :(得分:0)
简单地说,不是没有外部(第三方)库。