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

Jer*_*dge 8 delphi graphics gradient colors delphi-7

我正在制作与渐变相关的一小部分类型/功能,以备将来使用.我想确保至少有两个过程:ColorBetween和ColorsBetween.我可能想要在任意两种颜色(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;
Run Code Online (Sandbox Code Playgroud)

编辑:更改Percent: IntegerPercent: Single更平滑的效果 - 不限于100个可能的值.

Dav*_*nan 7

听起来你想要替换你的??? 同

Round((R1*Percent + R2*(100-Percent))/100.0)
Run Code Online (Sandbox Code Playgroud)

EnsureRange,因为该功能必须在0到255提供的范围有返回值在你的代码是没有必要的Percent,我想我会适用的范围是从0到100 EnsureRangePercent(强行进入范围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),
);
Run Code Online (Sandbox Code Playgroud)

你的第一个函数返回一个第一个颜色的数组ColorA.也许你会更好用这个:

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

这在数组的两端提供相同的行为.或者,也许你想同时ColorAColorB包括在内.然后你会用:

X / (Count-1) * 100.0
Run Code Online (Sandbox Code Playgroud)

但是如果你这样做,请记住Count必须大于1,否则你将除以零.那个nevers工作了!!


不要担心性能.毫无疑问,代码可以稍快一点,但它肯定不会成为瓶颈.您将采用这些颜色并与它们一起绘制.与这些简单的例程相比,这将消耗更多的资源.


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

  • 乘以(1/100)而不是除以100以获得更好的性能(是的,除法仍然比乘法慢得多) (2认同)