我还有另一个关于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,我不确定如何实现保存,我一直认为它仅用于加载?
这是我得到的一个我无法解决的问题。我一直试图改变透明度,颜色和模式等,但我似乎无法弄明白。
答案 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;
...