0

作成した 2 つのアニメーション GIF があります。それらを新しいビットマップに並べて追加したいので、両方のアニメーション GIF アニメーションが表示されます。静止画像ではなく、2 つのアニメーションを並べて表示します。

このコードは、現在使用している 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 です。しかし、この方法でやろうとすると、2 つのアニメーション GIF の 2 つのアニメーションではなく、2 つの静止画像を含む 1 つの新しいビットマップが得られます。

両方のアニメーション gif を 1 つのビットマップに追加するにはどうすればよいですか。たとえば、Internet Explorer でビットマップを開くと、2 つの 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++;
            }

したがって、RainMap 画像と SatelliteMap 画像の両方の 9 つの画像があります。そして、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 フレーム後に 1 つだけが続きます。

9 つの画像を含む画像が何度も何度もアニメーションを続け、2 番目の画像が最後までアニメーションを維持するようにするにはどうすればよいですか?

これは veljkoz が以前に書いた問題です。一方のアニメーション カウントは、もう一方よりも短くなっています。しかし、どうすれば解決できますか?

4

1 に答える 1

0

gif のみがアニメーションを持つことができます。ビットマップにはありませんし、今後もありません。

さらに、すべての gif スライドを抽出し (この回答を参照)、それらを別の gif に並べて配置し (この回答を参照)、スライド数が一致しない場合にどうするかを決定するという問題があります (これはほとんどの場合そうです)。

個人的には、コメントで@Mike Wが提案していることに同意します...

編集: 結果のgifには、単一のフレーム数があり、その後は繰り返されることに注意する必要があります。したがって、追加しようとしている両方の gif が何らかの形でそこに収まる必要があります。ここにはいくつかのオプションしかありません:

  • 両方の GIF のすべてのフレームの挿入を、最後に同時に到達するまで繰り返します (たとえば、1 つのフレームが 6 フレームで、もう 1 つのフレームが 9 フレームの場合、結果は 18 フレームになります。最初のフレームは 3 回繰り返され、残りのフレームは 2 回繰り返されます)。 . これは (明らかに) gif の長さとサイズを引き延ばしています。これはおそらくあなたが望むものではありませんが、最良の結果が得られます。数値が素数の場合、最悪のカウントが得られます。たとえば、53 フレームと 59 フレームの gif を結合すると、3127 フレーム持続します。

  • フレームが同時に終了するように、フレームのタイミングを変更します。もちろん、これはgifの一部を高速化/低速化します。(例: 6&9 フレームの gif: 結果には 9 枚のスライドがあります。最初の gif の最初の 3 枚のスライドを最後の 2 フレームまで繰り返すことができます。つまり、最初のスライドは 2 フレーム (#1 & #2)、2 番目のスライドも (#3 & #4) と 3 番目 (#5 & #6). 次に、残りのスライド (#7、5->#8、6->#9 に表示されているフレーム 4) をコピーします。

  • いくつかのスライドを削除 - 数が一致するようにいくつかのスライドを削除して GIF を短くします...

于 2013-09-19T07:22:48.930 に答える