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

前端之家收集整理的这篇文章主要介绍了delphi – 计算渐变颜色的最快方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在制作一些与渐变相关的类型/功能的小集合以供将来使用.我想确保至少有两个过程:ColorBetween和ColorsBetween.我可能只想获得任意两种颜色(ColorsBetween)之间的TColor数组,我可能只需要知道两种颜色之间的百分比(ColorBetween)的一个颜色值.

我已经在下面完成了它.除此之外,我有两个核心问题:

>如何按给定百分比计算每个RGB通道的中间颜色? (见下文我有[???])
>完成我正在做的事情的最快方法是什么(保持两个不同的功能)?

这是代码

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(([???]),255),EnsureRange(([???]),255)
  );
end;

编辑:更改百分比:整数百分比:单一以获得更平滑的效果 – 不限于100个可能的值.

解决方法

听起来你想要更换你的???同
Round((R1*Percent + R2*(100-Percent))/100.0)

代码中的EnsureRange不是必需的,因为此函数必须返回0到255范围内的值,前提是Percent在0到100的范围内.我想我会将EnsureRange应用于百分比(强制它进入范围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,(X+1) / (Count+1) * 100.0);

这在数组的两端提供相同的行为.或许你想要包括ColorA和ColorB.然后你会用:

X / (Count-1) * 100.0

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

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

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

猜你在找的Delphi相关文章