delphi 获取两个颜色差值

前面说了已经获取到颜色值了,现在需要比较两个颜色的差值。

两个颜色的根据RGB的差来取,有两种情况:

1.(R的平方+G的平方+B的平方)开根号,再两个颜色值相减获取差值。

2.(((R1-R2)的平方) + ((R1-R2)的平方) + ((R1-R2)的平方))开根号,即为差值

第一种情况差值比第二种情况差值小。

function TForm2.GetDoubleRGB(S1: string; S2: string): Integer; // 情况2
var
	ss1, ss2: TStrings;
	R1, G1, B1, R2, G2, B2, sum: Integer;
begin
	ss1 := TstringList.create;
	ss2 := TstringList.create;
	ss1.CommaText := s1;
	ss2.CommaText := s2;
	R1 := ss1[0].ToInteger;
	G1 := ss1[1].ToInteger;
	B1 := ss1[2].ToInteger;
	
	R2 := ss2[0].ToInteger;
	G2 := ss2[1].ToInteger;
	B2 := ss2[2].ToInteger;
	sum := sqr(R1-R2) + sqr(G1-G2) + sqr(B1-B2); 
	Result := Round(sqrt(sum));
end;

function TForm2.GetSumRGB(S: string): Integer; // 情况1
var
	ss: TStrings;
	R, G, B, sum: Integer;
begin
	ss := TstringList.create;
	ss.CommaText := s;
	R := ss[0].ToInteger;
	G := ss[1].ToInteger;
	B := ss[2].ToInteger;
	sum := sqr(R) + sqr(G) + sqr(B); 
	Result := Round(sqrt(sum));
end;

在Image的OnMoseMove事件中先获取一点对比颜色值放在Edit1中,再以鼠标移动的坐标作为对比放在Edit2中。

procedure TForm2.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
	Y: Single);
var
	vBitMapData: TBitmapData;
	sum, cl1, cl2: Integer;
	color: TAlphaColor;
begin
	if (Edit1.Text <> '') and (Edit2.Text <> '') then 
	begin
		if Image1.Bitmap.Map(TMapAccess.Write, vBitMapData) then 
		begin
			color := vBitMapData.GetPixel(Round(X), Round(Y));
			Edit2.Text := HexColorToRGB('$' +IntToHex(color, 1));
			CLB2.Color := color;//颜色组件
			cl1 := GetSumRGB(Edit1.Text);
			cl2 := GetSumRGB(Edit2.Text);
			sum := cl1 - cl2;
			if sum < 0 then sum := sum * -1;
			Edit3.Text := sum.ToString;
		end;
	end;
	Image1.Bitmap.Unmap(vBitMapData);
end;

 

posted @ 2015-11-28 18:11  王云盼  阅读(624)  评论(0编辑  收藏  举报