如题,也就是给定一个颜色,获取比该颜色深点或浅一点的颜色。
自己也写了一个算法,感觉不优,所以诚征算法,我的算法位置在:
http://blog.csdn.net/suiyunonghen/archive/2009/01/19/3837280.aspx
大家可以比对比对

解决方案 »

  1.   

    自定义了一个LRGB数据类型,实现带亮度的颜色,
    这里是一个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;
      

  2.   


    看了下老兄的算法非常好,不过有点考虑的欠周全,那就是有些Delphi自己定义的颜色,其本身已经包含了系统
    颜色clSystemColor,所以,此时的最高位就始终是FF,这样获得的最近颜色也就始终是白色的了,所以此时
    咱要将颜色修改成标准的RGB色
    也就是函数的TColor加一个ColorToRGB转换一下则可
    function TLColor(Color: TColor; LValue: Byte = $80): LRGB;
    begin
      Result := LValue shl 24 or Color;
    end;呵呵,感谢xiedewei
      

  3.   

    明天接帖function TLColor(Color: TColor; LValue: Byte = $80): LRGB;
    begin
      Result := LValue shl 24 or (ColorToRGB(Color));
    end; 
    函数改成这个就可以了
      

  4.   

    然后修改的函数如下:function GetNearColor(const Color: TColor;OffsetValue: Integer): TColor;
    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;
      

  5.   

    多谢LZ指点,这里已修改http://www.cnblogs.com/xiedewei/archive/2009/01/20/1379120.html
    不过系统色最高两位应该是80吧,例如clBtnFace = TColor(COLOR_BTNFACE or $80000000);
      

  6.   

    Result := ($80 + OffsetValue) shl 24 or (ColorToRGB(Color));什么意思?
    为什么不是Result := ColorToRGB(Color);?
      

  7.   

    因为我是以0作为参考点!所以加上了上面的计算
    另外,楼主可以将一些系统色编程16进制之后看看!
    clSystemColor就是$FF000000
      

  8.   

    我知道你以0作为参考点,
    可是跟Result := ($80 + OffsetValue) shl 24 or (ColorToRGB(Color));没什么关系呀,
    改成Result := ColorToRGB(Color);就可以了,
    LZ仔细考虑一下哦
      

  9.   

    另外我用的D6, D6的Graphics单元没有clSystemColor定义,而D2009里倒是有的。
    D6:
      clBtnFace = TColor(COLOR_BTNFACE or $80000000);
    D2009:
      clSystemColor = $FF000000;
      clBtnFace = TColor(clSystemColor or COLOR_BTNFACE);