unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Graphics, Dialogs, StdCtrls, ExtCtrls, LCLType,
ComCtrls, Controls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
Image2: TImage;
OpenDialog1: TOpenDialog;
TrackBar1: TTrackBar;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
end;
var
Form1: TForm1;
implementation
const
RedShift = 40;
GreenShift = -40;
BlueShift = -40;
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
AJpg: TJPEGImage;
begin
if not(OpenDialog1.Execute) then Exit;
AJpg := TJpegImage.Create;
AJpg.LoadFromFile(OpenDialog1.FileName);
Image1.Picture.Bitmap.Assign(AJpg);
AJpg.Free;
Button2.Enabled := True;
end;
function inRange(S: Single): Byte;
begin
if S <= 0 then
begin
Result := 0;
Exit;
end;
if S >= 255 then
begin
Result := 255;
Exit;
end;
Result := Round(S);
end;
procedure ChangeSaturation(Data: PRGBQUAD; Shift: Byte);
var
Luminance: Single;
ValueRed: Byte;
ValueGreen: Byte;
ValueBlue: Byte;
begin
ValueRed := Data^.rgbRed;
ValueGreen := Data^.rgbGreen;
ValueBlue := Data^.rgbBlue;
Luminance := (ValueRed+ValueGreen+ValueBlue) / 3;
Data^.rgbRed := inRange((Shift/127*(ValueRed-Luminance)/Luminance + 1) *Luminance);
Data^.rgbGreen := inRange((Shift/127*(ValueGreen-Luminance)/Luminance+1) *Luminance);
Data^.rgbBlue := inRange((Shift/127*(ValueBlue-Luminance)/Luminance+1) *Luminance);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
ScanData: PRGBQuad;
X, Y: Integer;
begin
Image2.Picture.Clear;
Image2.Picture.Assign(Image1.Picture);
Image2.Picture.Bitmap.BeginUpdate;
for Y := 0 to (Image1.Picture.Bitmap.Height-1) do
begin
ScanData := Image2.Picture.Bitmap.ScanLine[Y];
for X:= 0 to (Image1.Picture.Bitmap.Width-1) do
begin
ChangeSaturation(ScanData, TrackBar1.Position);
Inc(ScanData);
end;
end;
Image2.Picture.Bitmap.EndUpdate;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Constraints.MinHeight := 200;
Constraints.MinWidth := 360;
TrackBar1.Anchors := [akTop, akLeft, akRight];
Image1.Anchors := [akTop, akBottom, akLeft];
Image2.Anchors := [akTop, akBottom, akLeft];
end;
procedure TForm1.FormResize(Sender: TObject);
var
i: Integer;
begin
i := (Width - 60) div 2;
Image1.Width := i;
Image2.Left := i + 40;
Image2.Width := i;
end;
end.