每秒更改PictureBox中的图像 C#

4
我正在创建一个WinForm应用程序,使用网络摄像头拍摄人物照片,并尝试创建倒计时效果。我有4张图片,想要循环播放,但这证明是相当棘手的。
我使用计时器来计算秒数,但所有发生的事情只是应用程序稍微滞后,然后显示最后一张图片。请问有谁知道我如何完成这个任务吗?
以下是我的代码:
        int counter = 0;
        // start the counter to swap the images
        tmCountDown.Start();
        while (counter < 4)
        {
            // holding off picture taking
        }
        // reset counter for timer
        counter = 0;
        tmCountDown.Stop();

    /// <summary>
    /// timer event to switch between the countdown images
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void tmCountDown_Tick(object sender, EventArgs e)
    {
        counter++;
        //MessageBox.Show("c:/vrfid/apppics/" + counter + ".jpg");
        pbCountDown.Image = new Bitmap("c:/vrfid/apppics/" + counter + ".jpg");
    }

1
我没有看到你在哪里设置计时器的间隔...请展示相应的代码。 - Daniel Hilgarth
1
你也可以调用PictureBox的InvokePaint成员来强制它重新绘制自己。 - tom502
1
希望你也在递增计数器。无论如何,执行form.update或form.Refresh甚至是pictureBox.Refresh或Update方法有时可以完成任务。 - Zenwalker
1
你尝试设置图片后调用 this.Refresh() 了吗? - El Ronnoco
1
该组件的间隔已设置为1000。 - MattBH
这个 this.Refresh 没有起到作用。什么也没有发生。 - MattBH
5个回答

6
你应该使用
 counter++;
 this.SuspendLayout();
 pbCountDown.Image = new Bitmap("c:/vrfid/apppics/" + counter + ".jpg");
 this.ResumeLayout();

我测试过了,它可以正常工作,希望对你有所帮助。

3
Windows定时器类使用消息队列来通知计时器到期。因此,需要运行消息循环以获取正确数量的计时器到期次数。您应该将计数器变量设置为类字段,然后可以在事件处理程序中增加它。类似这样的代码:...
    // Main Code
    _counter = 0;
    tmCountDown.Start();

    // Event Handler
    private void tmCountDown_Tick(object sender, EventArgs e)    
    {
        _counter++;
        if (_counter == 4)
            tmCountDown.Stop();
        else
            pbCountDown.Image = new Bitmap("c:/vrfid/apppics/" + _counter + ".jpg");
    }

1
找到了解决方案,不需要计时器。感谢回答。
        int counter = 0;
        // start the counter to swap the images
        while (counter < 4)
        {
            // holding off picture taking
            counter++;
            //MessageBox.Show("c:/vrfid/apppics/" + counter + ".jpg");
            pbCountDown.Image = new Bitmap("c:/vrfid/apppics/" + counter + ".jpg");
            pbCountDown.Refresh();
            Thread.Sleep(1000);
        }
        // reset counter for timer
        counter = 0;

1
问题在于当计时器运行时,你正在一个忙碌的循环中旋转。你应该在事件处理程序中检查计时器停止条件。
我也有些惊讶代码能够正常工作。如果你使用的是System.Windows.Forms.Timer,你甚至不应该进入事件处理程序,所以计数器不应该被递增。而且计数器值没有得到正确的检查和更新。这个while循环可以变成无限循环。

0
在计时器属性中设置“INTERVAL =1000”,这意味着您的计时器每1000毫秒刷新一次,然后使用if(second == 10).....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接