0

编码:

this.TopMost = true;
this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
this.splitContainer1.SplitterDistance = (this.ClientSize.Width -
    this.splitContainer1.SplitterWidth) / 2;
pictureBox1.Image = Image.FromFile(@"d:\gifs\RadarGifAnimatoion.gif");//pb1.Image;
pictureBox2.Image = Image.FromFile(@"d:\gifs\SatelliteGifAnimatoion.gif");//pb2.Image;
timer1.Interval = animationSpeed;
timer1.Enabled = true;

我有一个计时器滴答事件:

private void timer1_Tick(object sender, EventArgs e)
{

}

在此示例中,计时器间隔为 80 毫秒。因此,在 timer1 滴答事件中,我希望每 80 毫秒拍摄两个图片框的快照或屏幕截图,并将这张照片保存到硬盘上。

所以最后我将在硬盘上保存两个图片框的 5 个图像。因此,如果我在硬盘上编辑 5 的每个图像,我将看到两个图片框图像。

如何在 timer1 滴答事件中做到这一点?

在此处输入图像描述

timer1 滴答事件中的更新代码:

private void timer1_Tick(object sender, EventArgs e)
        {
            using (var still = new Bitmap(this.Width, this.Height))
            {
                this.DrawToBitmap(still, new Rectangle(new Point(0, 0), still.Size));
                still.Save(String.Format(@"d:\GifForAnimation\still_{0}.gif", sequence++), System.Drawing.Imaging.ImageFormat.Gif);
                if (sequence == 5)
                {
                    timer1.Stop();
                }
            }

        }

我将构造函数中的 timer1 间隔设置为与创建动画时相同的速度。动画速度为 80 毫秒,因此 timer1 也设置为 80 毫秒。

并且仍然不是每 80 毫秒拍摄一张图片框的图像,而是拍摄或保存相同的图像。5张相同的图片。

4

1 回答 1

0

要创建屏幕截图,您可以尝试以下代码:

int sequence = 0;

private void timer1_Tick(object sender, EventArgs e)
{
    using(var still = new Bitmap(form.Width, form.Height))
    {
        form.DrawToBitmap(still, new Rectangle(new Point(0, 0), still.Size));
        still.Save(String.Format(@"c:\still_{0}.gif", sequence++), ImageFormat.Gif);
    }
}

您可以引用包含两个图像的任何容器,而不是表单。

编辑

此屏幕截图不包含开始菜单,仅包含两个图像控件的容器。

编辑2

像这样将 UI 渲染为位图可能不会为 GIF 设置动画,因为位图不知道动画。您还将进入竞争条件:更新 GIF 并在特定时间段内以正确的顺序制作屏幕截图。

我会使用视频捕捉软件来录制视频并选择我需要的帧。这比尝试解决这个问题和潜在的竞争条件要容易得多

于 2013-01-29T11:37:06.963 回答