4

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

通过使用 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 中的方式有​​关。

如果我确实需要 TGIfRenderer 我不知道如何实现它来保存,我一直认为它只是为了加载?

这是我无法解决的问题之一。我一直在尝试更改透明度、颜色和模式等,但我似乎无法弄清楚。

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 回答