如何在一个位图上添加两个动画 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 中(请参阅此答案),并决定如果幻灯片计数不匹配(很可能是这种情况)。
就个人而言,我会同意 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,以便计数匹配......