gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:29:24 27 4
gpt4 key购买 nike

我还有另一个关于 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,我不确定如何实现它来保存,我一直认为它只是用于加载?

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

最佳答案

我不是 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;
...

关于delphi - 使用 TGIFImage 重建和保存 Gif 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11459568/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com