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

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(使用前将#替换为@)

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

随机推荐

  • 如何在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 数组 并且我可能只需要