同理可得目标色的G、B值。现在你可以拿一个指定色(一种浅红)(RGB(153,0,0))和一种灰(RGB(204,204,204))算一下,分别四舍五入后得出的结果RGB(235,204,204),拿到做图软件里去对比一下吧,和做图软件里产生的彩色渐变出来的效果基本看不出区别了! 既然算法已经找到了,转成代码就再轻松不过了:
| procedure TForm1.Button2Click(Sender: TObject); var i, j: Integer; R, G, B, RGBTemp: Cardinal; t1, t2: Cardinal; Png: TPngObject; Rect: TRect; begin Png := TPngObject.Create; Png.LoadFromFile('2.png'); t1 := GetTickCount; for i := 0 to Png.Width - 1 do begin for j := 0 to Png.Height - 1 do begin RGBTemp := Png.Pixels[i, j]; R := GetRValue(RGBTemp); G := GetGValue(RGBTemp); B := GetBValue(RGBTemp); |
{ 计算公式:目标色R/G/B值 = 255 - (255 - 灰色R/G/B值) * (255 - 指定色R/G/B值) / (255 - 最深色R/G/B值) }
| Png.Pixels[i, j] := RGB(255 - (255 - R) * (255 - 153) div 255, // 按公式计算当前像素的 R 的值 255 - (255 - G) * (255 - 0) div 255, // 计算 G 值 255 - (255 - B) * (255 - 0) div 255); // 计算 B 值 end; end; Rect.Left := 448; Rect.Top := 152; Rect.Right := Rect.Left + Png.Width; Rect.Bottom := Rect.Top + Png.Height; Png.Draw(Canvas, Rect); t2 := GetTickCount - t1; ShowMessage(IntToStr(t2)); Png.Free; end; |
颜色转换后的效果如图3。
|