带有动画 GIF 的 TGIFImage - 事件不起作用 - 如何检测动画进度?

2024-03-03

德尔福的TGIFImage有以下事件:OnPaint, OnAfterPaint, OnLoop, OnEndPaint。 但在显示动画 GIF 时,这些事件都不会被调用。

我使用以下代码来显示动画 GIF:

  FGif := (Image1.Picture.Graphic as TGIFImage);
  FGif.OnProgress := GifProgress;
  FGif.OnLoop := GifLoop;
  FGif.OnPaint := GifPaint;
  FGif.OnEndPaint := GifEndPaint;
  FGif.OnAfterPaint := GifAfterPaint;
  FGif.Animate := True;

动画播放时如何提取当前可见帧索引?

如何检测动画何时完成?

如何检测下一帧何时显示?

OnProgress仅在绘制最后一个动画帧后的第一个动画循环期间调用事件 - TGIFImage 将从第一帧继续动画,但此事件停止工作。

我正在使用 Delphi 10.2 东京。


尽管占位符存在,但您提到的大多数事件都没有(正如您所发现的)实现。大约十年前,当对系统进行重大修改时,它们似乎就消失了。GifImg unit.

然而,通过另一种方法,您可以解决您提到的问题。那就是声明TGIFRenderer单独,这使您可以访问所需的信息。

示例应用程序如下所示:

type
  TForm22 = class(TForm)
    Button1: TButton;
    OpenDlg: TOpenDialog;
    SaveDlg: TSaveDialog;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    r: TRect;
    gif: TGifImage;
    rend: TGIFRenderer;
    procedure GifChange(Sender: TObject);
  public
  end;

implementation


procedure TForm22.Button1Click(Sender: TObject);
begin
  if not OpenDlg.Execute() then Exit;

  // the following is 12 by default to be as slow as Mozilla in last millenium
  GIFDelayExp := 10; // set to 10 for correct timing

  gif:= TGIFImage.Create;
  gif.LoadFromFile(OpenDlg.FileName);
  gif.OnChange := GifChange;

  r := Rect(0, 0, Gif.Width, Gif.Height);
  r.offset((Image1.Width-Gif.Width) div 2, (Image1.Height-Gif.Height) div 2);

  rend := TGIFRenderer.Create(Gif);
  rend.Animate := True;
  rend.StartAnimation;
  rend.Draw(Image1.Canvas, r);

  //Set animate to true at the end, otherwise an exception at address will be raised.
  gif.Animate := True;
end;

procedure TForm22.GifChange(Sender: TObject);
begin
  rend.Draw(Image1.Canvas, r);

  Label1.Caption := Format('Frame nr %d / %d',[rend.FrameIndex, gif.Images.Count]);
  Label2.Caption := Format('Per frame: %d ms',[rend.FrameDelay]);
  Label3.Caption := Format('Full cycle: %d s',[rend.FrameDelay * gif.Images.Count]);
end;

随着TGifRenderer.FrameIndex, TGifImage.Images.Count and TGifRenderer.FrameDelay您可以计算问题的答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有动画 GIF 的 TGIFImage - 事件不起作用 - 如何检测动画进度? 的相关文章

  • 在 Pascal 中将文本文件中的字符串读入数组

    使用这个程序 我试图读取一个文件并将其随机打印到控制台 我想知道是否必须使用数组 例如 我可以将字符串分配到一个数组中 然后从数组中随机打印 但是 我不确定如何解决这个问题 另一个问题是 我当前的程序没有从我的文件中读取第一行 我有一个文本
  • TWebbrowser 大量内存泄漏:到目前为止还没有解决方案

    我有一个使用的应用程序TWebbrowser定期导航到特定 URL 并提取一些数据 该应用程序 24x7 持续运行 并在页面中进行大量导航 问题是TWebbrowser有一个众所周知的内存泄漏问题 每次导航到新页面时 应用程序使用的内存都会
  • 启动时系统托盘图标不出现

    我在 FormCreate 事件处理程序中使用以下代码来创建系统托盘图标 当我运行程序时 系统托盘图标显示正常 我将应用程序设置为在 Windows 启动时自动启动 当我重新启动计算机时 我的应用程序进程已启动 但系统托盘图标从未出现 我认
  • 如何修复 Delphi Prism ASP.NET 错误:“解析器错误消息:‘Oxygene’不是受支持的语言”

    我在 Delphi Prism 中编写了一个 ASP NET Web 应用程序 不是网站 在我的开发机器上一切正常 但是当我将其安装在测试服务器上时 出现以下错误 Server Error in MyApp Application Pars
  • iOS Objective-C 对象:何时使用release,何时不使用它

    我在 iOS 下 正在使用 delphi Tokyo 进行开发 这是我的代码 aUIImage TUIImage Wrap TUIImage alloc initWithCGImage aCGImageRef try aData TNSDa
  • 条件表达式在包内是否被破坏?

    考虑以下片段 requires designide rtl vcl IF RTLVersion lt 19 0 E2026 Constant expression expected IF CompilerVersion 22 0 same
  • 如何使用 jQuery 和“长轮询”通过 Indy HTTP 服务器动态更新 HTML 页面?

    我读过这篇文章使用 JavaScript 和 jQuery 的简单长轮询示例 http techoctave com c7 posts 60 simple long polling example with javascript and j
  • EIdOSSLUnderlyingCryptoError 和“使用 SSL 连接时出错。错误:14094410...”

    我在 OS X 上的 Delphi 10 1 Berlin 中遇到 Indy 组件问题 我正在使用TIdHTTP使用 HTTPS 连接到 Web 服务 问题是从 OS X 客户端连接到服务器 在 OS X 上运行时 我总是遇到同样的错误 P
  • Delphi XE 中的数据绑定向导 - 可以将其配置为映射到 MSXML 接口吗?

    Delphi XE 中的数据绑定向导生成继承自 Delphi 自己的 DOM ADOM XML v4 实现的类和接口 它似乎不支持针对模式进行验证 解析时验证 选项仅适用于 MSXML 供应商type 从 VCL 源代码以及 IDE 中 X
  • 如何将 JSON 字符串转换为图像?

    我有一个将图像转换为 JSON 数组的应用程序 并将其保存到 blob 字段中 function getImage String var memorystream TMemoryStream jsonArray TJSONArray beg
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 如何追踪手柄泄漏?

    在我的一个应用程序中 我观察到句柄数量不断增加 在不使用应用程序的情况下 该数字大约每秒增加一次 因此后台处理代码的某些部分一定存在句柄泄漏 我如何追踪此类泄漏 有什么工具可以帮助解决这个问题吗 跟踪句柄泄漏时要寻找哪些模式 导致手柄泄漏的
  • Delphi中的抽象类

    我正在使用一个具有许多抽象类的组件套件 现在我想应用多态性 但在创建对象时收到错误抽象类 即使我不需要 我是否应该重写所有虚拟方法 有什么解决方法或解决方案吗 为了创建类的实例 您需要重写所有声明为虚拟抽象的方法 即使您不使用它们 如果您确
  • 在 Delphi 2009 上安装最新版本的 Indy 10 [重复]

    这个问题在这里已经有答案了 是否有更新 Delphi 2009 中的 Indy 10 组件的分步指南 我读过正在卸载线程 https stackoverflow com questions 486210 what is the proper
  • DELPHI 和 WANT 或 NANT

    We use 巡航控制 net http confluence public thoughtworks org display CCNET Welcome to CruiseControl NET在 Delphi 2006 应用程序中进行持
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 如何从 Delphi 中的函数返回对象而不导致访问冲突?

    我有一个返回 TStringList 的 delphi 函数 但是当我返回一个值并尝试使用它时 我收到一个访问冲突错误 即 myStringList FuncStringList myStringList Items Count lt Th
  • 使用项目中的波形文件

    我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音 但我实际上想要一个包含波形文件的静态可执行文件 这在Delphi XE2中可能吗 这是我的代码 SndPlaySound Raw wav SND ASYNC or SND L
  • Delphi:写入后代类中私有祖先的字段

    我需要修复第三方组件 该组件的类具有私有变量 该变量由其后代主动使用 TThirdPartyComponentBase class private FSomeVar Integer public end TThirdPartyCompone
  • 如何用不同的颜色绘制选定的列表框项目?

    是否可以更改 TListBox 中的项目选择焦点颜色和文本颜色 当项目中未启用主题或列表框样式设置为所有者绘制时 项目周围的选择将被涂成蓝色 我相信这是由系统的外观设置全局定义的 我想将所选项目的颜色更改为自定义颜色 举个例子 结果会是这样

随机推荐

  • 大数组上的分段错误

    以下代码在 2GB 机器上运行时出现分段错误 但在 4GB 机器上运行 int main int c 1000000 cout lt lt done n return 0 数组的大小仅为 4Mb C 中可以使用的数组的大小是否有限制 您可能
  • Ehcache - 找不到生成器的缓存名称

    我已经浏览了这里提出的很多类似问题 但我仍然无法找到解决方案 所以这是我的问题 我正在尝试在 Spring Boot 中设置 Ehcache Spring 2 2 6 RELEASE Ehcache 3 8 1 缓存服务 I ve got
  • data-* 属性可以包含 HTML 标签吗?

    I E img src world jpg 据我了解 它基本上是有效的 但最好使用 HTML 实体 来自HTML 4 参考 http www w3 org TR WD html40 970708 charset html 您还应该在属性值中
  • 如何显示外部 PostgreSQL 连接的 WORK_MEM?

    我知道我可以使用SHOW WORK MEM 在psql中查看当前使用的连接的值 但其他连接呢 我有一个应用程序可以打开许多连接并动态更改WORK MEM基于上下文 我想监控这些WORK MEM进行更改以确保它们得到应用 换句话说 我想 调整
  • 有效的 MFC ID 范围

    这让我很困惑 我正在读这个技术说明 https learn microsoft com en gb cpp mfc tn020 id naming and numbering conventions它指出 Prefix Resource t
  • 如何在 .xib 文件上创建的 UIViewController 中设置 UITableView

    我有一堂这样的课 interface ExerciseLogDetails UIViewController
  • AVURLAsset获取视频大小

    这真是令人沮丧 我正在尝试获取 AVURLasset 的大小 但尽量避免naturalSize因为 Xcode 告诉我 这在 iOS5 中已被弃用 但是 替代品是什么 我找不到任何关于如何在不使用 naturalsize 的情况下获取视频尺
  • CRT 库类型

    我试图更好地掌握 Visual Studio 2013 中的 CRT 库选项 C gt 代码生成 gt 运行时库 以及如何知道选择哪个选项 以及何时更改默认值 From MSDN http support microsoft com en
  • 如何在java应用程序中使用webRTC特定模块

    我有一个简单的java应用程序应用程序客户端可以向服务器发送 接收纯音频 UDP 数据包 服务器将音频数据包转发给除发送者之外的所有人 现在我该如何使用webRTC 回声消除我的应用程序端的模块或其他功能模块 我发现可以使用 JNI 和 w
  • .htaccess 拒绝子文件夹中的文件

    我想阻止对 sub folder index php 的访问 但不阻止对其他任何地方的 index php 的访问
  • 在 Jade 视图中使用 javascript 代码 - if(variable) 显示未定义而不是传递

    所以这是一个反复出现的问题 我还没有找到另一个例子 所以这里是 渲染 Jade 模板时我得到 variableName undefined即使在使用时 if variableName 在模板中 示例 我使用它作为 信息 闪存消息的一部分 i
  • 具有不同 ID 的列的总和?

    我有一个包含多个 ID 的表 需要一个查询来返回每个 ID 的列之和 Calls 表看起来像这样 EmployeeID TypeOfCall InvoiceAmount John NC 50 john NC 100 Joe NC 76 Jo
  • 如何创建我自己的 shell 来替换 e4 RCP 中 MTrimmedWindow 中创建的 shell?

    有没有办法用用户定义的窗口替换 Eclipse RCP 为 MTrimmedWindow 生成的 shell Eclipse 创建一个具有特定样式类型的 shell 该样式类型只能在创建时提供 我想从为 MTrimmedWindow 创建的
  • Compose LazyColumn 选择一项

    我想选择 LazyColumn 的一项并更改文本颜色 如何识别选择了哪个项目 Code val items listOf Pair A 1 Pair AA 144 Pair BA 99 var selectedItem by mutable
  • 如何将 { 和 } 放入格式字符串中[重复]

    这个问题在这里已经有答案了 我试图在运行时生成一些代码 在其中放入一些样板内容 并允许用户输入实际的工作代码 我的样板代码看起来像这样 using System public class ClassName public double Th
  • 为什么有人声称 Java 的泛型实现很糟糕?

    我偶尔听说 Java 在泛型方面做得不太好 最近的参考 here https stackoverflow com questions 457822 what are the things java got right 请原谅我的经验不足 但
  • 具有动态范围和 customOrder excel 的排序宏

    我正在尝试制作一个多级排序宏 而行数是动态的 我一直在摆弄一些测试数据来尝试让它工作 但是我不断从 Excel 中收到 1004 运行时错误 希望第二双眼睛能帮助解决这个问题 这是测试数据 A B C D Num Status Junk J
  • 检查接收者是否拿起电话

    在 Android 中 我需要确定接听电话是否已接听 这似乎不可能 因为 TelephonyManager 不提供该状态 其他人建议查看通话记录列表并检查最后呼叫号码的持续时间 这不太好 因为最后拨打的号码可能是几小时或几天前 还有其他建议
  • 禁用 Webpack 的捆绑

    我想使用 webpack 作为 typescript 构建工具 这样每个 typescript 文件都会被翻译成 1 个 js 文件 webpack 指南有这样的配置 module exports entry app tsx module
  • 带有动画 GIF 的 TGIFImage - 事件不起作用 - 如何检测动画进度?

    德尔福的TGIFImage有以下事件 OnPaint OnAfterPaint OnLoop OnEndPaint 但在显示动画 GIF 时 这些事件都不会被调用 我使用以下代码来显示动画 GIF FGif Image1 Picture G