我有3张照片,每张照片都有一个彩色圆圈。这3张照片是红色,绿色和黄色。
我将它放在Windows窗体中的PictureBox
中。我想将这些图像从绿色切换到黄色到红色或其他。
有什么我可以让它们相互淡化而不是以正常方式切换它们吗?
我知道这可以很容易地使用flash / j-query完成,但我想知道我能达到多远。
使用普通Windows窗体功能的Windows窗体中的类似内容。
注意:我正在使用.net框架4和Windows窗体。
答案 0 :(得分:5)
见Transition of images in Windows Forms Picture box。有一种解决方案可以使用this页面上的计时器转换图像。
网站代码:
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
放到表单上。这是一个使用它的示例程序:
namespace WindowsApplication1
{
public partial class Form1 : Form
{
private float mBlend;
private int mDir = 1;
public Form1()
{
InitializeComponent();
timer1.Interval = 30;
timer1.Tick += BlendTick;
blendPanel1.Image1 = Bitmap.FromFile(@"c:\temp\test1.bmp");
blendPanel1.Image2 = Bitmap.FromFile(@"c:\temp\test2.bmp");
timer1.Enabled = true;
}
private void BlendTick(object sender, EventArgs e)
{
mBlend += mDir * 0.02F;
if (mBlend < 0) { mBlend = 0; mDir = 1; }
if (mBlend > 1) { mBlend = 1; mDir = -1; }
blendPanel1.Blend = mBlend;
}
}
}
您需要修改Bitmap.FromFile()
来电。建立并运行。您应该看到显示的图像从第一张图像平滑变换到第二张图像,没有任何闪烁。很多调整代码的方法都很有趣。
答案 1 :(得分:1)
我不知道这是不是一个好主意,但我会选择2个图像框,一个淡入,另一个淡出,并在时间流逝时更改alpha。
答案 2 :(得分:1)
就像@Igoris建议的那样,你需要使用两个相互重叠的控件,并且你应该定义一个计时器,这样当你想淡入或淡出时,启动计时器并在其刻度中减少透明度首先控制并在第二个上增加它...... ,问题是普通控件默认情况下不支持透明。所以你必须继承它并在这里应用透明是从TransparentPictureBox
继承的自定义PictureBox
:
public class TransparentPictureBox : System.Windows.Forms.PictureBox
{
/// <summary>
/// Initialize new instance of this class.
/// </summary>
public TransparentPictureBox()
: base()
{
DoubleBuffered = true;
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.BackColor = Color.Transparent;
}
}