4

DelphiXEに含まれているGifImage.pasに関してさらに別の問題があります。私が持っている問題は、私が尋ねた前の質問に関連しています:TGifImage透明性の問題

上記の前の質問の問題は、TGifRendererを使用して、読み込みに完全に機能するGifファイルから正しいフレームを表示することで解決されました。

しかし、今は逆のことをする必要があります。一連のビットマップから新しいGifを再構築して保存する必要があります。しかし、保存すると、出力Gifファイルは以前と同じように正しく描画されません。

TGIfRendererが再度必要かどうかはわかりません。これは、ビットマップを追加してパックしてからGifを保存するだけだからです。

私が直面している正確な問題を確認するには、読み続けてください(長い投稿については事前にお詫びします!)

まず、これらのビットマップを新しいサンプルプロジェクトフォルダーに保存します。

注:これらの画像は元々ビットマップでしたが、StackOverflowによってPNGに変換されたようであるため、Paintにコピーして再度保存する必要がある場合があります。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

新しいプロジェクトから、次のコードを貼り付けます。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, GifImg, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Bmp: TBitmap;
  Gif: TGIFImage;
begin
  Bmp := TBitmap.Create;
  Gif := TGIFImage.Create;
  try
    Bmp.LoadFromFile('img0.bmp');
    Bmp.Transparent := True;
    Gif.Add(Bmp);
    Bmp.LoadFromFile('img1.bmp');
    Bmp.Transparent := True;
    Gif.Add(Bmp);
    Bmp.LoadFromFile('img2.bmp');
    Bmp.Transparent := True;
    Gif.Add(Bmp);
    Bmp.LoadFromFile('img3.bmp');
    Bmp.Transparent := True;
    Gif.Add(Bmp);

    // add netscape loop if we want animation to keep repeating
    TGIFAppExtNSLoop.Create(Gif.Images.Frames[0]).Loops := 0;
    Gif.Pack;
    Gif.SaveToFile('test.gif');
  finally
    Bmp.Free;
    Gif.Free;
  end;
end;

end.

保存したビットマップがプロジェクトのexeファイルと同じフォルダーにあることを確認してから(またはファイル名のパスを変更して)、プロジェクトを実行して出力gifを作成します。

保存された出力が正しくありません。上に保存されたペンギンビットマップから、この保存されたGifを取得します。

ここに画像の説明を入力してください

フレームが重なり合っているか、何かファンキーなことが起こっているのがわかります!このgifファイルのソースはここから見つけることができます:http ://www.animated-gifs.org.uk/agif/ani02.gif

非常に多くのフレームがあるため、Gifのすべてのフレームを使用したわけではありませんが、アニメーション化したときにどのように機能するかを確認できます。

これはすべてのgifで発生するわけではなく、一部のgifだけがこのように保存されているように見えることに注意してください。別の例は、ペンギンの代わりにこれらのビットマップを試すことです。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

結果は次のとおりです。

ここに画像の説明を入力してください

これは(飛行機の炎に注意してください):

ここに画像の説明を入力してください

簡単に言うと、一連のビットマップからGifを保存して、開いたときと同じようにする必要があります。上記のサンプルビットマップから、実際の画像データとの矛盾がないことがわかります。したがって、これは、それらがgifに追加される方法と関係があると私は信じています。

TGIfRendererが再び必要になった場合、保存のためにそれを実装する方法がわかりません。ロード専用だと思い続けますか?

これは私が解決できない問題の1つです。透明度や色、モードなどを変えようとしていますが、わからないようです。

4

1 に答える 1

4

私はGIFImgまたはgif画像の専門家ではありませんが、問題はフレームの廃棄に関連しているようです。「GIFImg.pas」で「disposal」を検索すると、テスト画像で機能するように思われる以下の画像が見つかりました。

....
Gif.Add(Bmp); // last frame

for i := 0 to Gif.Images.Count - 1 do
  for j := 0 to Gif.Images[i].Extensions.Count - 1 do
    if Gif.Images[i].Extensions[j] is TGIFGraphicControlExtension then
      TGIFGraphicControlExtension(Gif.Images[i].Extensions[j]).Disposal :=
          dmBackground;
...
于 2012-07-12T20:25:54.130 に答える