gpt4 book ai didi

delphi - 无法在动态创建的 TBitmap 上绘制 GIF

转载 作者:行者123 更新时间:2023-12-03 15:05:45 30 4
gpt4 key购买 nike

我想提取 GIF 图像的帧。下面的代码可以工作,但这不是我需要的。我需要将提取的帧保留在一系列位图中。

procedure TForm1.Button2Click(Sender: TObject);
var
GIF: TGIFImage;
Bitmap: TBitmap;
I: Integer;
GR: TGIFRenderer;
R: TRect;
begin
GIF := TGIFImage.Create;
TRY
GIF.LoadFromFile('c:\1.gif');
Bitmap := TBitmap.Create; <------------ one single object, reused
Bitmap.SetSize(GIF.Width, GIF.Height);
GR := TGIFRenderer.Create(GIF);
try
for I := 0 to GIF.Images.Count - 1 do
begin
GR.Draw(Bitmap.Canvas, Bitmap.Canvas.ClipRect);

Self.Canvas.Draw(0, 0, Bitmap);

GR.NextFrame;
end;
finally
GR.Free;
end;
finally
GIF.Free;
//Bitmap.Free;
end;
end;

所以我为每个帧动态创建一个位图。但这是行不通的。它只会在所有位图中显示相同/第一帧!

procedure TForm1.Button2Click(Sender: TObject);
var
GIF: TGIFImage;
Bitmap: TBitmap;
I: Integer;
GR: TGIFRenderer;
R: TRect;
begin
GIF := TGIFImage.Create;
TRY
GIF.LoadFromFile('c:\1.gif');
GR := TGIFRenderer.Create(GIF);
try
for I := 0 to GIF.Images.Count - 1 do
begin
Bitmap := TBitmap.Create; <----- multiple bitmaps, one for each frame
Bitmap.SetSize(GIF.Width, GIF.Height);

GR.Draw(Bitmap.Canvas, Bitmap.Canvas.ClipRect);

Self.Canvas.Draw(0, 0, Bitmap);

GR.NextFrame;
end;
finally
GR.Free;
end;

{TODO: store bitmaps in a TObjectList for later use
List.Add(Bitmap); }
finally
GIF.Free;
end;
end;

上面这段代码有什么问题吗?也许 TGIFRenderer 只绘制帧之间的差异?

<小时/>

TLama/jachguate 更新:

TLama 说代码不起作用,因为我没有释放位图。我不想释放位图。我稍后需要它们。这是一些(演示级)代码。

VAR List: TObjectList;    {used and freed somwhere else}

procedure TForm1.Button2Click(Sender: TObject);
var
GIF: TGIFImage;
UniqueBMP: TBitmap;
I: Integer;
GR: TGIFRenderer;
R: TRect;
begin
List:= TObjectList.Create;
GIF := TGIFImage.Create;
TRY
GIF.LoadFromFile('c:\1.gif');

GR := TGIFRenderer.Create(GIF);
try
for I := 0 to GIF.Images.Count - 1 do
begin
UniqueBMP := TBitmap.Create;
UniqueBMP.SetSize(GIF.Width, GIF.Height);

if GIF.Images[I].Empty then Break;

GR.Draw(UniqueBMP.Canvas, UniqueBMP.Canvas.ClipRect);

Self.Canvas.Draw(0, 0, UniqueBMP);
Sleep(50);

List.Add(UniqueBMP);

GR.NextFrame;
end;
finally
GR.Free;
end;
finally
GIF.Free;
end;
end;


procedure TForm1.btnFreeClick(Sender: TObject);
begin
FreeAndNil(List);
end;

最佳答案

TCustomGIFRenderer.Draw 检查要渲染的 Canvas 。如果它与上次渲染时记住的不同(并且不同,因为您正在为每一帧创建新的位图),则调用 TCustomGIFRenderer.Reset 方法,该方法作为其顾名思义,将帧索引重置为 0。这就是为什么你总是只渲染第一帧。

关于delphi - 无法在动态创建的 TBitmap 上绘制 GIF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15140614/

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