在计时器刻度事件中加载winforms后闪烁的图像

时间:2013-11-10 16:12:35

标签: c# .net multithreading image timer

我的问题如下: 我有一个计时器,每1毫秒我想加载一个图像,并以赢取形式显示在图片框中 第一个图像非常精细,但从某些角度来看,图像开始加载很多。 你能告诉我如何解决这个问题吗?

关心并感谢您的时间:)

   private string path = "";
    private int index = 0;
    private void fileSourceToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            string fullPath = ofd.FileName;
            string fileName = ofd.SafeFileName;

            path = fullPath.Replace(fileName, "");

            MessageBox.Show("Path for file source has been selected");
        }
    }

    private const string IMAGENAME = "TestImage";
    Bitmap b;
    private void timer_Tick(object sender, EventArgs e)
    {
        try
        {
            string currentImage = IMAGENAME + index.ToString() + ".bmp";
            index++;
            b = new Bitmap(path + "\\" + currentImage);

            pb.SizeMode = PictureBoxSizeMode.StretchImage;
            pb.Image = b;
        }
        catch { };

    }

    private void button1_Click(object sender, EventArgs e)
    {
        timer.Start();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        timer.Stop();
    }

    private void button3_Click(object sender, EventArgs e)
    {
        try
        {
            string currentImage = IMAGENAME + index.ToString() + ".bmp";
            index += 1;
            Bitmap b = new Bitmap(path + "\\" + currentImage);

            pb.Image = b;
        }
        catch { };
    }

    private void button4_Click(object sender, EventArgs e)
    {
        try
        {
            index -= 1;
            string currentImage = IMAGENAME + index.ToString() + ".bmp";
            Bitmap b = new Bitmap(path + "\\" + currentImage);
            pb.Image = b;
        }
        catch { };
    }

2 个答案:

答案 0 :(得分:0)

首先使用DoubleBuffered属性。

答案 1 :(得分:0)

GDI +非常慢,即使使用双缓冲,它仍然很慢。 我建议你找一个替代品,因为没有办法解决“闪烁”。

然而,有一件事,你实际上在tick手柄中加载图像的方式是非常麻烦的。

我建议您将所有必需图像的字节加载到某种类型的集合中,例如。数组。 然后只需从图像字节创建位图。

此外,您甚至没有处理当前图像,在为下一张图像分配新内存之前,您应该这样做。