0

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

这段代码在 form1 的顶部,我现在正在使用:

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 上打开位图时,我会看到两个动画并排移动?

编辑**

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

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 图像。其余的 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 之前写过的问题。一个动画计数比另一个短。但是我该如何解决呢?

4

1 回答 1

0

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

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

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

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

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

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

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

于 2013-09-19T07:22:48.930 回答