如何在一个位图上添加两个动画 gif

本文关键字:添加 两个 gif 动画 一个 位图 | 更新日期: 2023-09-27 18:32:00

我创建了两个动画 gif。我想将它们并排添加到新的位图中,这样我就会看到两个动画 gif 动画。不是作为单一的图像,而是两个并排的动画。

这段代码位于 form1 im 的顶部,现在使用:

public static class BitmapExtensions
    {
        public static Bitmap DoubleBitmap(this Bitmap bm)
        {
            Bitmap bitmap = new Bitmap(bm.Width * 2, bm.Height);
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                g.DrawImage(bm, Point.Empty);
                g.DrawImage(bm, new Point(bm.Width, 0));
                return bitmap;
            }
        }
        public static Bitmap AppendBitmap(this Bitmap bm, Bitmap rightBitmap)
        {
            Bitmap bitmap = new Bitmap(bm.Width + rightBitmap.Width, Math.Max(bm.Height, rightBitmap.Height));
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                g.DrawImage(bm, Point.Empty);
                g.DrawImage(rightBitmap, new Point(bm.Width, 0));
                return bitmap;
            }
        }
    }

然后我像这样使用它:

private void CreateNewImage(string DirOfUrls)
        {
            List<string> files = Directory.GetFiles(DirOfUrls, "RainImage*.*").ToList();
            List<string> files1 = Directory.GetFiles(DirOfUrls, "SatelliteImage*.*").ToList();
                Bitmap bmp = new Bitmap(@"d:'localpath'RainMapGif");//files1[i]);
                Bitmap bmp1 = new Bitmap(@"d:'localpath'SatelliteMapGif");//files[i]);
                //Use it
                //Double the same image
                Bitmap doubledBitmap =  bmp1.DoubleBitmap();
                //Append new image
                Bitmap appendedBitmap = bmp1.AppendBitmap(bmp);
                appendedBitmap.Save(@"d:'localpath'newbitmapGif", System.Drawing.Imaging.ImageFormat.Gif);
        }

RainMapGif 和 SatelliteMapGif 是动画 gif。但是当我尝试以这种方式执行此操作时,我得到了一个带有两个静止图像的新位图,而不是两个动画 GIF 的两个动画。

如何将两个动画 gif 添加到一个位图中,例如,当我在 Internet Explorer 上打开位图时,我会看到两个动画并排移动两个 gif ?

编辑**

这是我之前使用它的方式:

private void CreateNewImage(string DirOfUrls)
        {
            int newImageCounter = 0;
            List<string> files = Directory.GetFiles(DirOfUrls, "RainImage*.*").ToList();
            List<string> files1 = Directory.GetFiles(DirOfUrls, "SatelliteImage*.*").ToList();
            for (int i = 0; i < files.Count; i++)
            {
                if (newImageCounter == 9)
                {
                    CreateNewGif(DirOfUrls);
                    //break;
                }
                Bitmap bmp = new Bitmap(files1[i]);
                Bitmap bmp1 = new Bitmap(files[i]);
                //Use it
                //Double the same image
                Bitmap doubledBitmap =  bmp1.DoubleBitmap();
                //Append new image
                Bitmap appendedBitmap = bmp1.AppendBitmap(bmp);
                appendedBitmap.Save(@"d:'localpath'newbitmap" + newImageCounter.ToString("D6"), System.Drawing.Imaging.ImageFormat.Gif);
                newImageCounter++;
            }

所以我有9张图像,它们都是RainMap图像和SatelliteMap图像。其余的卫星地图图像是单张的。

然后我使用CreateNewGif:

private void CreateNewGif(string urlsdirs)
        {
            List<string> files = Directory.GetFiles(urlsdirs, "RainImage*.*").ToList();
            List<string> files1 = Directory.GetFiles(urlsdirs, "SatelliteImage*.*").ToList();
            List<string> test = files;
            test.RemoveRange(0, files1.Count);
            List<string> newbitmap = Directory.GetFiles(localdir, "newbitmap*.*").ToList();
            for (int i = 0; i < test.Count; i++)
            {
                newbitmap.Add(test[i]);
            }
            uf.MakeGIF(newbitmap, localdir + "newbitmapGif", 50, true);
        }

并制作新的动画 gif:

uf.MakeGIF(newbitmap, localdir + "newbitmapGif", 50, true);

但是新的动画 gif 并不好,因为雨图像在卫星图像之前结束,所以新的动画 gif 同时显示动画,并且在 9 帧后只有一个继续。

我怎样才能使带有 9 张图像的那个会一遍又一遍地继续动画,而第二个图像会一直保持动画直到最后?

这是veljkoz之前写过的问题。一个动画计数比另一个动画计数短。但是我该如何解决呢?

如何在一个位图上添加两个动画 gif

只有 gif 可以有动画。位图不会,也永远不会。

此外,还有一个问题是提取所有 gif 幻灯片(请参阅此答案),将它们并排放置在另一个 gif 中(请参阅此答案),并决定如果幻灯片计数不匹配(很可能是这种情况)。

就个人而言,我会同意 W @Mike在评论中的建议......

编辑:您必须记住,生成的 gif 将具有单个帧数,之后它会重复自己。因此,您尝试添加的两个 gif 都必须以某种方式适合那里。这里只有几个选项:

  • 重复插入两个 GIF 的所有帧,直到它们同时到达末尾(例如,如果一个有 6 帧,另一个有 9 帧 - 结果将有 18 帧。第一个会重复 3 次,另一个重复 2 次)。这(显然)延长了 gif 的长度和大小,这可能不是您想要的,但它会给你最好的结果。当数字是质数时,你会得到最差的计数 - 例如,53和59帧GIF在连接时将持续3127帧。

  • 更改帧的计时,以便它们同时结束。这当然会加速/减慢 GIF 的某些部分。(例如 6 和 9 帧 GIF:结果有 9 张幻灯片 - 您可以重复第 1 张 GIF 的前 3 张幻灯片到最后两帧 - 这意味着第 1 张幻灯片将持续 2 帧(#1 和 #2),第二张也(#3 和 #4)以及第三张(#5 和 #6)。然后复制其余的幻灯片 - 第 4 帧显示在 #7、5->#8、6->#9 处,这就是结束)。

  • 删除一些幻灯片 - 通过删除一些幻灯片来缩短 gif,以便计数匹配......