计算渐变颜色的最快方法?

2023-11-22

我正在制作一小部分与渐变相关的类型/函数以供将来使用。我想确保至少有两个过程:ColorBetween 和 ColorsBetween。我可能只想获取任意 2 种颜色 (ColorsBetween) 之间的 TColor 数组,并且我可能只需要知道两种颜色 (ColorBetween) 之间的百分比的一个颜色值。

我已经在下面完成了大部分工作。除此之外,我有两个核心问题:

  1. 如何按给定百分比计算每个 RGB 通道的中间颜色? (请参阅下面我在哪里[???])
  2. 完成我正在做的事情的最快方法是什么(同时保留两个不同的功能)?

这是代码:

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  StrUtils, StdCtrls, Math;

type
  TColorArray = array of TColor;

implementation

function ColorsBetween(const ColorA, ColorB: TColor; const Count: Integer): TColorArray;
var
  X: Integer; //Loop counter
begin
  SetLength(Result, Count);
  for X:= 0 to Count - 1 do 
    Result[X]:= ColorBetween(ColorA, ColorB, Round((X / Count) * 100)); //Correct?
end;

function ColorBetween(const ColorA, ColorB: TColor; const Percent: Single): TColor;
var
  R1, G1, B1: Byte;
  R2, G2, B2: Byte;
begin
  R1:= GetRValue(ColorA);
  G1:= GetGValue(ColorA);
  B1:= GetBValue(ColorA);
  R2:= GetRValue(ColorB);
  G2:= GetGValue(ColorB);
  B2:= GetBValue(ColorB);
  Result:= RGB(
    EnsureRange(([???]), 0, 255),
    EnsureRange(([???]), 0, 255),
    EnsureRange(([???]), 0, 255)
  );
end;

EDIT:改变了Percent: Integer to Percent: Single获得更平滑的效果 - 不限于 100 个可能的值。


听起来你想更换你的 ???和

Round((R1*Percent + R2*(100-Percent))/100.0)

The EnsureRange在您的代码中没有必要,因为此函数必须返回 0 到 255 范围内的值,前提是Percent范围是 0 到 100。我想我会应用EnsureRange to Percent(强制其范围为 0.0 到 100.0),然后使用以下代码:

Result := RGB(
  Round((R1*Percent + R2*(100-Percent))/100.0),
  Round((G1*Percent + G2*(100-Percent))/100.0),
  Round((B1*Percent + B2*(100-Percent))/100.0),
);

您的第一个函数返回一个数组,其第一个颜色是ColorA。也许你这样做会更好:

for X:= 0 to Count - 1 do
  Result[X]:= ColorBetween(ColorA, ColorB, (X+1) / (Count+1) * 100.0);

这在数组的两端提供了相同的行为。或者也许你两者都想要ColorA and ColorB包括。然后你会使用:

X / (Count-1) * 100.0

但如果您这样做,请记住 Count 必须大于 1,否则您将被零除。那永远不会成功!


不用担心性能。毫无疑问,代码可以稍微快一点,但它肯定不会成为瓶颈。您将使用这些颜色并用它们进行绘画。这将比这些简单的例程消耗更多的资源。


最后一点。 RGB 空间中的插值对于人眼来说看起来不会特别平滑或线性。使用浮点百分比并不能回避这个事实。为了在观看时获得最佳效果,您需要在不同的色彩空间中进行插值。

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

计算渐变颜色的最快方法? 的相关文章

  • 使用普通画布/文本输出更新LayeredWindow

    有没有一种方法可以使用画布在表单上绘图 然后使用 updatelayeredwindow 这样表单就不可见 但文本可见 就像只显示文本的半透明表单一样 如果没有 那么有没有办法只用画布 opengl directx 制作某种半透明形式 我想
  • 我可以在“Delphi 2007 for Win32”中使用.NET DLL吗?

    是否可以在 Delphi 2007 for Win32 中使用 NET DLL 我尝试以与 ActiveX 组件相同的方式导入 DLL 但它似乎不起作用 组件菜单 gt 导入组件 gt 导入 NET 程序集 是否可能 如果可以 步骤是什么
  • VCL.位图到 FMX.位图

    我在网上找到了这段代码 但 FMX Bitmap 没有扫描线 是否可以以某种方式将 VCL TBitmap 复制或绘制到 FMX Bitmap IFDEF MSWINDOWS type TBitmap FMX Types TBitmap T
  • 使用带渐变的圆角矩形的 CSS3 聚光灯效果

    我正在为一个网络应用程序编写一个交互式教程 旨在突出显示用户界面的各个部分 本教程旨在一次重点关注一个部分 并告诉用户如何与其交互 您可能在智能手机应用程序上看到过类似的内容 对于可用于突出现有界面的特定 CSS 我发现的最佳解决方案是使用
  • 如何在 Vista 上安装 Delphi 7

    我多次尝试在 Vista 上安装 Delphi 7 但 Vista 告诉我此应用程序 Delphi 7 存在已知问题 从而阻止了我这样做 我公司的其他几个人在 Vista 上安装 D7 时遇到了问题 由此得出的结论是 我们的 D7 应用程序
  • 获取 TransactSql 批处理中的语句数计数

    对于不使用 Delphi 的读者 虽然以下内容是根据 Delphi 编码来表达的 但我的实际技术问题不是特定于 Delphi 的 而是关于如何找出 Sql Server 如何 理解 TransactSql 批处理提交给它 TAdoQuery
  • Delphi TImageList 位图更改

    我正在使用 Delphi XE2 Update 3 Update 4 与我们的一些第 3 方组件不兼容 因此我们尚未更新 我在我的应用程序中使用 TImageList 我注意到很多时候当它从源视图切换到表单视图 F12 时 突然之前未修改的
  • 如何避免使用 WinApi.Windows 的 Delphi 应用程序中的 dll 劫持

    Delphi 最新版本使用各种系统 dll 的静态链接 例如 WinApi Windows 单元中的 version dll 这会导致在单元初始化之前加载 version dll 这会打开一个安全漏洞 可以通过将受感染的 version d
  • 学习 SVG 的书籍/教程 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 更改 ggplot 对象的数据集

    我正在绘制数据的子集ggplot2我想知道我是否会以某种方式使用已包含在ggplot原始数据子集中的对象 举个例子 这是第一个图 代码块 1 require ggplot2 p lt ggplot mtcars aes mpg wt col
  • 我可以让我的 Delphi 应用程序在特定时间(例如上午 12:00)启动,而不运行应用程序吗?

    我看到一个已安装的应用程序 它从供应商的网站提供一些 XML 数据并将其显示在主窗体窗口中 我想这很简单 但我注意到 即使我关闭系统托盘中的应用程序 明天早上 上午 12 00 正好 它也会再次弹出 这太酷了 我不确定它是用 Delphi
  • 如何在 Delphi REST 中发布内容类型为“multipart/form-data”的数据?

    我正在尝试使用 REST API 发送请求multipart form data作为内容类型 我总是收到 HTTP 1 1 500 Internal Error 作为响应 我尝试向需要的方法发送请求application x www for
  • 给定背景颜色,如何获得使其在该背景颜色上可读的前景色?

    给定背景颜色 如何获得使其在该背景颜色上可读的前景色 我的意思是在程序中自动计算前景色 或者简化问题 如果前景色是从白色 黑色中选择的 那么在程序中如何进行选择呢 这是我用 Java 和 Javascript 做的一个 它是松散地基于thi
  • 如何遍历任意给定集合中的枚举?

    我有很多枚举类型 它们与相应的集合相结合 例如 type TMyEnum meOne meTwo meThree TMyEnums set of TMyEnum 我正在尝试提出一组可以运行的函数any枚举集 而不是为每个枚举编写单独的函数
  • 如何在Delphi中下载一个非常简单的HTTPS页面?

    我尝试了在这里看到的代码 但它不适用于 HTTPS 我需要将此页面作为字符串下载 并在其上添加一些换行符 以便将信息按顺序放入 TMemo 中 怎么做 我尝试使用 Indy 但由于 SSL 问题而失败 我尝试了此页面的解决方案 如何将网页下
  • TDictionary 上的 GetItem 由链接器消除

    我正在使用一个TDictionary of
  • Delphi 返回 TList 时出错

    我做了一个非常简单的应用程序 但我有一个我真的无法理解的问题 看一下这个基本代码 unit Unit1 interface uses Winapi Windows Winapi Messages System SysUtils System
  • Word 2010 自动化:“转到书签”

    我有一个用 Delphi 7 编写的程序 它打开一个基于模板的新 Word 文档 文档打开后 系统会自动跳转到书签 在模板中预定义 并在其中添加一些文本 以下代码在 Word 2003 中工作正常 但会导致invalid variant o
  • Java制作一条有向线并使其移动

    我想画一条有向线并让它移动 我能够绘制一条有向线并移动该线 但当我移动该线时箭头会移位 这是我的绘画方法 Line2D Double line new Line2D Double startX startY endX endY g2d dr
  • 为什么未初始化的指针会导致内存访问冲突接近 0?

    据说often 但并非总是如此 当你在接近于零的内存位置 比如 89 美元 获得 AV 时 你就有了一个未初始化的指针 但我也在 Delphi 书籍中看到了这一点 嗯 或者它们都是由同一作者写的 Update 引自 Bob Swart 等人

随机推荐

  • 如何在Python中安装VLC模块

    我尝试使用 PIP 安装 VLC 但出现以下错误 pip install VLC Downloading unpacking vlc Cannot fetch index base URL https pypi python org sim
  • Python:如何保存 os.system 的输出[重复]

    这个问题在这里已经有答案了 在 Python 中 如果我使用 wget 使用 os system wget 下载文件 它会在屏幕上显示如下 Resolving Connecting to HTTP request sent awaiting
  • 流畅断言:比较两个数字集合的近似值

    我有两个双精度数组 有没有办法使用 FluentAssertions 使用 BeApproximately 技术逐个元素地比较数组 一个范围值足以满足整个数组的需要 Example double source 10 01 8 01 6 01
  • 进程组必须有一个正在运行的领导进程吗?

    在类 Unix 操作系统中 如果一个进程 pid和它的pgid相等 则该进程是进程组的领导者 但是 如果进程领导者已经退出 并且同组中的其他进程仍在运行 那么谁是继任的领导者进程 没有继任领导者 一旦流程组领导者退出 该组就失去了领导权 没
  • 更新 pyplot.scatter 的位置和颜色

    我已经为此苦苦挣扎了一段时间 但无法让它发挥作用 我正在分块读取文件并从中绘制散点图数据 并且我想通过更新中每个块的散点图来 动画化 它for循环 并使其适应实时数据流 所以像这个丑陋的例子适用于单个图 x 1 2 3 4 y 4 3 2
  • Yocto:将内核模块配方添加到映像,但它不会在启动时加载

    出于测试目的 我使用 yocto 提供的示例配方来演示如何构建内核模块 SUMMARY Example of how to build an external Linux kernel module LICENSE GPLv2 LIC FI
  • 如何向 UIActivityViewController 对象添加不同的文本

    我实现了一个 UIActivityViewController 用于共享一些信息 在这种情况下 我有一个问题 是否可以在 facebook 共享 twitter 共享 或邮件共享之间制作不同的文本 设置的文本与其他文本不同 一个好的 UIA
  • 以编程方式生成 VSTS 的个人访问令牌

    我是否可以连接到 VSTS REST 端点 以便让用户自行提供另一个 PAT 最好是在当前到期前几天 我有一个时间表应用程序 现在正在连接到 VSTS 以获取工作项信息并更新所述工作项 但是 在某个时候 90 天 180 天或一年后 PAT
  • “git fetch”后 FETCH_HEAD 引用未正确更新

    我有一个从远程存储库中提取的本地存储库 跑步git pull也git fetch git merge FETCH HEAD用于执行完全相同的操作 正如预期的那样的描述git pull 描述 将远程存储库中的更改合并到当前分支中 在默认模式下
  • 如何从父文件夹或同级文件夹模块访问模块?

    我正在尝试从以下位置访问模块parser rs and another rs in the solve rs 如何包含这些模块并使用 use语句 如果不可能 代码结构应该是什么 这是应用程序文件夹树 app src main rs anot
  • 可空类型之间的转换

    NET 4 0 中是否有一个转换器支持可空类型之间的转换以缩短指令 例如 bool nullableBool GetSomething byte nbyte nullableBool HasValue byte Convert ToByte
  • 为什么我会收到 Can't make a table of more 2^31 elements in R 的错误

    你好我有一个数据框record在8维的R中 有60个变量 缺失值用NA替换 其他值是单词 当我尝试像这样对数据框进行制表时feeds lt table record 我收到一条错误消息 Error in table record attem
  • 如何在多核8节点集群中调度Hadoop Map任务?

    我有一个 仅映射 无缩减阶段 程序 输入文件的大小足以创建 7 个映射任务 我已经通过查看生成的输出 part 000 到 part006 验证了这一点 现在 我的集群有 8 个节点 每个节点有 8 个核心和 8 GB 内存 并在头节点托管
  • 预留实例模式下适用于 Azure 网站的新 Azure 分布式缓存

    Windows Azure 的其他出色新功能 6 月 7 日发布 中似乎缺少的一项功能是在预留实例模式下为网站集群的预留实例定义分布式缓存的能力 截至目前 似乎只能为独立的 Web 角色或辅助角色创建分布式缓存 有谁知道解决方法或知道这是否
  • Java 原语放在栈上还是堆上?

    我只知道非基元 对象 位于堆上 方法位于堆栈上 但是基元变量呢 update 根据答案 我可以说堆可以为给定的对象拥有新的堆栈和堆 鉴于该对象将具有原始变量和引用变量 本地定义的原语将位于堆栈上 但是 如果将原语定义为对象实例的一部分 则该
  • Struts2 从 JSP 访问枚举

    我有以下课程 package com test public class SomeClass public enum COLOR RED BLUE 我想访问的值COLOR我的 JSP 中的枚举 我已经尝试过以下代码 但它不起作用
  • Rspec 模拟:ActiveRecord::AssociationTypeMismatch

    我是 Rspec 新手 正在尝试为用户配置文件设置测试 个人资料属于用户 现在 我与通过用户模型工作的第三方网站进行了 API 集成 但该 API 链接的一些信息包含在配置文件中 因此我在配置文件上有一个 after update 过滤器
  • 两张表具有相同的列,还是一张表具有附加列?

    假设我有两个表 苹果和橙子 它们具有相同的列 只是表名不同 将其变成一个带有附加列 类型 的表 假设它称为 水果 然后存储 苹果 或 橙色 的值 是否有任何优点 缺点 编辑以澄清 创建表苹果 id 整数 权重整数 各种 varchar 25
  • Tomcat 无法找到我的 Servlet 并抛出异常,但为什么呢?

    我正在尝试进入 Java Web 开发 但似乎在 Tomcat 和一个极其简单的 servlet 方面遇到了一个奇怪的问题 每次我尝试加载应用程序时 catalina 日志都会喷出以下内容 Caused by java lang Illeg
  • 计算渐变颜色的最快方法?

    我正在制作一小部分与渐变相关的类型 函数以供将来使用 我想确保至少有两个过程 ColorBetween 和 ColorsBetween 我可能只想获取任意 2 种颜色 ColorsBetween 之间的 TColor 数组 并且我可能只需要