آقا محمد دقت نکردیا! بجای SetBitmapHLS باید از ColorizeBitmap استفاده می کردی. هر چند طبق بررسی های اخیر اون تابع یکم آچارکشی احتیاج داشت!
procedure ColorizeBitmap(const Source, Dest: TBitmap; const H, L, S: Word);
var
I: Integer;
J: Integer;
SP, DP: PByteArray;
Color: TColor;
ColorValue: Double;
begin
for I := 0 to Source.Height - 1 do
begin
SP := Source.ScanLine[I];
DP := Dest.ScanLine[I];
for J := 0 to Source.Width - 1 do
begin
ColorValue :=
SP^[J * 3 + 0] * 0.11 + SP^[J * 3 + 1] * 0.59 + SP^[J * 3 + 2] * 0.3;
Color := ColorHLSToRGB(H, (Round((ColorValue))+L)div 2, S);
DP^[J * 3 + 0] := GetBValue(Color);
DP^[J * 3 + 1] := GetGValue(Color);
DP^[J * 3 + 2] := GetRValue(Color);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
Var
H,L,S:Word;
Color: TColor;
begin
if ColorDialog1.Execute then
begin
ColorRGBToHLS(ColorDialog1.Color,H,L,S);
ColorizeBitmap(ImageSource.Picture.Bitmap, ImageDest.Picture.Bitmap,
H, L, S);
Shape1.Brush.Color := ColorDialog1.Color;
ImageDest.Repaint;
end;
end;
اگر هم می خوای تاثیر شدت نور رنگ انتخابیت بیشتر بشه می تونی مثلا به این روش عمل کنی:
Color := ColorHLSToRGB(H, (Round((ColorValue))+ 3 * L) div 4, S);
اما هر چی این تاثیر رو بیشتر کنی کنتراست تصویر خروجی کمتر می شه.