使用TGIFImage重建和保存Gif的问题

时间:2012-07-12 19:52:29

标签: delphi delphi-xe

我还有另一个关于Delphi XE附带的GifImage.pas的问题。我遇到的问题与我之前提出的问题有关:TGifImage Transparency Issue

上一个问题的问题通过使用TGifRenderer从Gif文件中显示正确的帧来解决,该文件非常适合加载。

但现在我需要做相反的事情,我需要重建并从一系列位图中保存一个新的Gif。但是当我保存时,输出Gif文件绘制不正确 - 就像之前一样。

我不确定我是否需要再次使用TGIfRenderer,因为我所做的只是添加位图并打包然后保存Gif。

要查看我遇到的确切问题,请继续阅读(对于长篇帖子提前道歉!)

首先将这些位图保存到新的示例项目文件夹:

注意:这些图片最初是位图,但StackOverflow似乎已将它们转换为PNG,因此您可能需要复制到Paint并再次保存。

enter image description here

enter image description here

enter image description here

enter image description here

现在,从新项目中粘贴以下代码:

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:

enter image description here

你可以看到相互重叠的帧或者正在发生的事情!这个gif文件的源代码可以在这里找到:http://www.animated-gifs.org.uk/agif/ani02.gif

我没有使用Gif中的所有帧,因为有很多帧,但你可以看到它在动画时应该如何工作。

请注意,每个gif都不会发生这种情况,只有少数人会像这样保存。另一个例子是尝试这些位图而不是企鹅:

enter image description here

enter image description here

enter image description here

enter image description here

结果是:

enter image description here

应该是(注意飞机上的火焰):

enter image description here

简单地说,我需要从一系列位图中保存一个Gif,就像它们打开时的样子一样。您可以从上面的示例位图中看到,与实际图像数据没有任何不一致,因此这让我相信它与它们添加到gif的方式有关。

如果我确实需要再次使用TGIfRenderer,我不确定如何实现保存,我一直认为它仅用于加载?

这是我得到的一个我无法解决的问题。我一直试图改变透明度,颜色和模式等,但我似乎无法弄明白。

1 个答案:

答案 0 :(得分:4)

我不是GIFImg或gif图像的专家,但问题似乎与帧的处理有关。在“GIFImg.pas”中搜索“处置”,我想出了下面的内容,它似乎适用于您的测试图像:

....
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;
...