假设我有个现成的颜色列表都是16进制的
例如
$000000
$110000
$002200
$000088
$000099
$00CC00
$0000BB
$0000CC
$AA00DD
$0000EE
$2200FF
$FFFFFF然后我随机给出一个颜色的16进制代码,想计算与列表中哪个颜色最接近,求算法,分不够另外开帖

解决方案 »

  1.   

    应该先把这种十六进制转换成RGB分量三个值,然后分别比较三个分量的差值。
    三个分量差值的绝对值之和最小的即为最接近的
      

  2.   

    var
      DeltaI, DeltaJ: Cardinal;
      I, J: Integer;
    begin
      ListBox1.Sorted := True;  // 保存颜色列表
      with TStringList.Create do
      try
        Assign(ListBox1.Items);
        Sorted := True;
        if not Find(Edit1.Text, I) then // Edit1.Text:随机给出一个颜色的16进制代码
        begin
          J := I - 1;
          DeltaJ := ABS(StringToColor(Strings[J]) - StringToColor(Edit1.Text));
          DeltaI := ABS(StringToColor(Strings[I]) - StringToColor(Edit1.Text));
          I := IfThen(DeltaJ > DeltaI, I, J);
        end;
        Edit2.Text := Strings[I]
      finally
        Free;
      end;
    end;
      

  3.   

    >>三个分量差值的绝对值之和最小的即为最接近的
    似乎应该是三个分量差值平方和最小的为最接近的
      

  4.   

    budded(System is bussy!) 的测试通不过
      I := IfThen(DeltaJ > DeltaI, I, J);
     小弟学识浅薄,修改不来...1楼的思路正确测试下来没问题,散分