如题,也就是给定一个颜色,获取比该颜色深点或浅一点的颜色。
自己也写了一个算法,感觉不优,所以诚征算法,我的算法位置在:
http://blog.csdn.net/suiyunonghen/archive/2009/01/19/3837280.aspx
大家可以比对比对
自己也写了一个算法,感觉不优,所以诚征算法,我的算法位置在:
http://blog.csdn.net/suiyunonghen/archive/2009/01/19/3837280.aspx
大家可以比对比对
调试欢乐多
这里是一个Demo:http://www.cnblogs.com/xiedewei/archive/2009/01/20/1379120.html
请朋友们指教!
LRGB = Cardinal;
{含亮度的颜色,
LRGB($80XXXXXX) = TColor($XXXXXX),
LRGB($FFXXXXXX) = TColor($FFFFFF),
LRGB($00XXXXXX) = TColor(0), ...}function TLColor(Color: TColor; LValue: Byte = $80): LRGB;
begin
Result := LValue shl 24 or Color;
end;function LTColor(Color: LRGB): TColor;
var
Delta: Integer;
L, R, G, B, dR, dG, dB: Byte;
begin
R := Byte(Color shr 0);
G := Byte(Color shr 8);
B := Byte(Color shr 16);
L := Byte(Color shr 24);
Delta := L - $80;
if Delta > 0 then
begin
Inc(Delta);
dR := not R;
dG := not G;
dB := not B;
end
else begin
dR := R;
dG := G;
dB := B;
end;
R := R + (dR * Delta) shr 7;
G := G + (dG * Delta) shr 7;
B := B + (dB * Delta) shr 7;
Result := R or (G shl 8) or (B shl 16);
end;
看了下老兄的算法非常好,不过有点考虑的欠周全,那就是有些Delphi自己定义的颜色,其本身已经包含了系统
颜色clSystemColor,所以,此时的最高位就始终是FF,这样获得的最近颜色也就始终是白色的了,所以此时
咱要将颜色修改成标准的RGB色
也就是函数的TColor加一个ColorToRGB转换一下则可
function TLColor(Color: TColor; LValue: Byte = $80): LRGB;
begin
Result := LValue shl 24 or Color;
end;呵呵,感谢xiedewei
begin
Result := LValue shl 24 or (ColorToRGB(Color));
end;
函数改成这个就可以了
var
R, G, B, dR, dG, dB: Byte;
begin
if (OffsetValue > 127) or (OffsetValue < -127) then
raise Exception.Create('偏移值为-127-127之间')
else
begin
Result := ($80 + OffsetValue) shl 24 or (ColorToRGB(Color));
R := Byte(Result shr 0);
G := Byte(Result shr 8);
B := Byte(Result shr 16);
if OffsetValue > 0 then
begin
Inc(OffsetValue);
dR := not R;
dG := not G;
dB := not B;
end
else
begin
dR := R;
dG := G;
dB := B;
end;
R := R + (dR * OffsetValue) shr 7;
G := G + (dG * OffsetValue) shr 7;
B := B + (dB * OffsetValue) shr 7;
Result := RGB(R,G,B)
end;
end;
不过系统色最高两位应该是80吧,例如clBtnFace = TColor(COLOR_BTNFACE or $80000000);
为什么不是Result := ColorToRGB(Color);?
另外,楼主可以将一些系统色编程16进制之后看看!
clSystemColor就是$FF000000
可是跟Result := ($80 + OffsetValue) shl 24 or (ColorToRGB(Color));没什么关系呀,
改成Result := ColorToRGB(Color);就可以了,
LZ仔细考虑一下哦
D6:
clBtnFace = TColor(COLOR_BTNFACE or $80000000);
D2009:
clSystemColor = $FF000000;
clBtnFace = TColor(clSystemColor or COLOR_BTNFACE);