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つです。透明度や色、モードなどを変えようとしていますが、わからないようです。