我还有一个关于 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 我不知道如何实现它来保存,我一直认为它只是为了加载?
这是我无法解决的问题之一。我一直在尝试更改透明度、颜色和模式等,但我似乎无法弄清楚。