8

2 つの異なる gif ファイルを 1 つのファイルに結合しようとしています。

まず、gif 形式について多くのことを学びました。そして、遅延時間の値は、gif ファイルのブロックである Graphics Control Extension に設定されていることを知っています。

最初の gif を保存し、FrameDelay の値を次のように設定しました。

    ImageCodecInfo codeInfo = GetEncoder(ImageFormat.Gif);
    System.Drawing.Imaging.Encoder saveEncoder = System.Drawing.Imaging.Encoder.SaveFlag;
    EncoderParameters parameters = new EncoderParameters(1);

    parameters.Param[0] = new EncoderParameter(saveEncoder, (long)EncoderValue.MultiFrame);
    PropertyItem PropertyTagFrameDelay = img1.GetPropertyItem(0x5100);
    PropertyTagFrameDelay.Value = new byte[] { 0x96, 0x00 };// this is the delay value 0x0096, means 1.5 second
    img1.SetPropertyItem(PropertyTagFrameDelay);

    PropertyItem LoopCount = img1.GetPropertyItem(0x5101);
    LoopCount.Value = new byte[] { 0x00, 0x00 };// this means the gif loops endlessly
    img1.SetPropertyItem(LoopCount);

    img1.Save(@"c:\ddd.gif", codeInfo, parameters);

次に、2 番目のフレームとして別の画像を追加しようとしました。

    parameters = new EncoderParameters(1);
    parameters.Param[0] = new EncoderParameter(saveEncoder, (long)EncoderValue.FrameDimensionTime);
    PropertyTagFrameDelay = img2.GetPropertyItem(0x5100);
    PropertyTagFrameDelay.Value = new byte[] { 0x96, 0x00 };// this is the delay value 0x0096, means 1.5 second
    img2.SetPropertyItem(PropertyTagFrameDelay);

最後に、この画像を終了します。

parameters = new EncoderParameters(1);
  parameters.Param[0] = new EncoderParameter(saveEncoder, (long)EncoderValue.Flush);
  img1.SaveAdd(parameters);

そして、2 番目のフレームの遅延時間は常に 0 であることがわかりました。

いろいろ試してみたのですが、0x96にする方法がわかりません。

それで、それの何が問題なのですか?

4

4 に答える 4

19

これは、どの.NET イメージ エンコーダーでもサポートされていません。GDI+ や WIC (System.Drawing.BitmapおよびSystem.Windows.Media.Imaging.PngBitmapEncoderクラスの基礎となるネイティブ コーデック) によるものではありません。

非常に奇妙な見落としのように聞こえるかもしれませんが、最も可能性の高い理由は、GIF がソフトウェア特許によって妨げられていたことです。Unisys は LZW 圧縮アルゴリズムの権利を所有しており、そのライセンス料の獲得を積極的に追求し始めました。最も多くのお金を手に入れることができる最も明白なターゲットから始めて、マイクロソフトは永遠にリストのトップにいます. 彼らも謙虚ではありませんでした。ウェブページで GIF を使用した非営利または個人のウェブサイトは、1999 年に5,000ドルを無駄にしなければなりませんでした。

これにより、画像フォーマットが殺されました。これより前はいたるところにありましたが、ほとんどの人がそれらを使用しなくなりました。あまりにも驚くほど早く、これには数か月しかかかりませんでした。幸いなことに、誰もがアニメーション GIF で完全に満たされていますが、以前はひどくやり過ぎていました。目の隅のすべてが動いていたウェイバックマシンで、当時のウェブページを見つけることができます。幸運な偶然だけではなく、オープン ソースの PNG 形式が開発された主な理由でもありました。私たちのラッキースターに感謝します:)

この特許は、住んでいる場所にもよりますが、2004 年頃に期限が切れたので、もう Unisys からの手紙を恐れる必要はありません。

簡単に言えば、この機能をプログラムに追加するには、別のライブラリを探し回る必要があります。この既存の SO questionで十分にカバーされています。ここで繰り返す必要はありません。

于 2013-08-03T13:47:49.837 に答える
1

Microsoft Developer Centerから: SaveAdd を使用してアニメーション gif ファイルにフレームを追加することはできません。

アニメーション GIF を作成するには、アニメーションの各フレームをステップ実行する必要があります。これの良い例は、VCSKicksまたはStackoverflow の同じコードに示されています。

于 2013-07-30T01:16:43.057 に答える