mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-03 01:04:38 +02:00
246 lines
5.7 KiB
ObjectPascal
246 lines
5.7 KiB
ObjectPascal
unit imagetest;
|
|
|
|
{$mode objfpc}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, Math, Forms, Graphics, Dialogs,
|
|
StdCtrls, ComCtrls, ExtCtrls, LCLIntf, LCLType, IntfGraphics, FPImage;
|
|
|
|
type
|
|
|
|
{ TfrmImage }
|
|
|
|
TfrmImage = class(TForm)
|
|
btnSaveJPEG: TButton;
|
|
btnResize: TButton;
|
|
btnRotate: TButton;
|
|
imageDepths: TImage;
|
|
MyImage: TImage;
|
|
Label1: TLabel;
|
|
trackJPEG: TTrackBar;
|
|
procedure btnResizeClick(Sender: TObject);
|
|
procedure btnRotateClick(Sender: TObject);
|
|
procedure btnSaveJPEGClick(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
private
|
|
|
|
public
|
|
procedure RotateBitmap(ASource: TBitmap; ADest: TCanvas; x, y, Angle: integer);
|
|
end;
|
|
|
|
var
|
|
frmImage: TfrmImage;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
{ TfrmImage }
|
|
|
|
procedure TfrmImage.FormCreate(Sender: TObject);
|
|
var
|
|
MyBitmap: TBitmap;
|
|
begin
|
|
// Create a 100x100 bitmap and draw to it
|
|
MyBitmap := TBitmap.Create;
|
|
MyBitmap.PixelFormat := pf4bit;
|
|
MyBitmap.Width := 80;
|
|
MyBitmap.Height := 80;
|
|
// MyBitmap.
|
|
// MyBitmap.Canvas.Brush.Color := RGBA(0,0,0,0);
|
|
MyBitmap.Canvas.Pen.Color := clBlue;
|
|
MyBitmap.Canvas.Rectangle(20, 20, 60, 60);
|
|
imageDepths.Canvas.Draw(0, 0, MyBitmap);
|
|
//
|
|
MyBitmap.PixelFormat := pf32bit;
|
|
MyBitmap.Width := 80;
|
|
MyBitmap.Height := 80;
|
|
MyBitmap.Canvas.Brush.Color := TColor($F2F2F2);
|
|
MyBitmap.Canvas.Pen.Color := clBlue;
|
|
MyBitmap.Canvas.Rectangle(20, 20, 60, 60);
|
|
imageDepths.Canvas.Draw(100, 0, MyBitmap);
|
|
MyBitmap.Free;
|
|
end;
|
|
|
|
procedure TfrmImage.RotateBitmap(ASource: TBitmap; ADest: TCanvas; x, y, Angle: integer);
|
|
var
|
|
SrcIntfImg, TempIntfImg: TLazIntfImage;
|
|
ImgHandle,ImgMaskHandle: HBitmap;
|
|
px, py : Integer;
|
|
CurColor : TFPColor;
|
|
TempBitmap: TBitmap;
|
|
|
|
ToX,ToY : Integer;
|
|
Xo,Yo : Integer;
|
|
beta : Single;
|
|
MinX,MaxX : Integer;
|
|
MinY,MaxY : Integer;
|
|
Dx,Dy : Integer;
|
|
|
|
procedure RotatePts(Var aX,aY : Integer);
|
|
Var Xr,Yr : Integer;
|
|
begin
|
|
//Change new axe
|
|
xr:=aX-Xo;
|
|
yr:=aY-Yo;
|
|
|
|
//Rotation
|
|
aX:=Xo+Round(Xr*Cos(Beta)+Yr*Sin(Beta));
|
|
aY:=Yo+Round(Xr*Sin(Beta)*-1+Cos(Beta)*Yr);
|
|
end;
|
|
|
|
begin
|
|
SrcIntfImg:=TLazIntfImage.Create(0,0);
|
|
SrcIntfImg.LoadFromBitmap(ASource.Handle,ASource.MaskHandle);
|
|
TempIntfImg:=TLazIntfImage.Create(0,0);
|
|
|
|
//Calculate the Sin and Cos of beta for later.
|
|
Beta:=(Angle)*Pi/180;
|
|
|
|
try
|
|
TempIntfImg.LoadFromBitmap(ASource.Handle,ASource.MaskHandle);
|
|
TempBitmap:=TBitmap.Create;
|
|
|
|
Xo:= SrcIntfImg.Width div 2; //Center of rotation for x
|
|
Yo:= SrcIntfImg.Height div 2; //Center of rotation for y
|
|
px:=xo;
|
|
py:=yo;
|
|
|
|
//Calc new size after rotation
|
|
px:=0;
|
|
py:=0;
|
|
RotatePts(px,py);
|
|
toX:=0;
|
|
toY:=SrcIntfImg.Height;
|
|
RotatePts(ToX,ToY);
|
|
|
|
MinX:=Min(px+x,Tox+x);
|
|
MaxX:=Max(px+x,Tox+x);
|
|
MinY:=Min(py+y,Toy+y);
|
|
MaxY:=Max(py+y,Toy+y);
|
|
|
|
px:=SrcIntfImg.Width;
|
|
py:=0;
|
|
RotatePts(px,py);
|
|
toX:=SrcIntfImg.Width;
|
|
toY:=SrcIntfImg.Height;
|
|
RotatePts(ToX,ToY);
|
|
|
|
MaxX:=MaxIntValue([px+x,Tox+x,MaxX]);
|
|
MaxY:=MaxIntValue([py+y,Toy+y,MaxY]);
|
|
MinX:=MinIntValue([px+x,Tox+x,MinX]);
|
|
MinY:=MinIntValue([py+y,Toy+y,MinY]);
|
|
|
|
TempIntfImg.Width :=(MaxX-MinX)+1;
|
|
TempIntfImg.Height:=(MaxY-MinY)+1;
|
|
TempIntfImg.FillPixels(FPColor(0, 0, 0, 0));
|
|
|
|
Dx:=(TempIntfImg.Width div 2)-Xo;
|
|
Dy:=(TempIntfImg.Height div 2)-Yo;
|
|
|
|
for py:=0 to SrcIntfImg.Height-1 do
|
|
begin
|
|
for px:=0 to SrcIntfImg.Width-1 do
|
|
begin
|
|
CurColor:=SrcIntfImg.Colors[px,py];
|
|
|
|
ToX:=Px; ToY:=py;
|
|
RotatePts(ToX,ToY);
|
|
|
|
try
|
|
TempIntfImg.Colors[ToX+Dx,ToY+Dy]:=CurColor;
|
|
except
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
TempIntfImg.CreateBitmaps(ImgHandle,ImgMaskHandle,false);
|
|
TempBitmap.Handle:=ImgHandle;
|
|
TempBitmap.MaskHandle:=ImgMaskHandle;
|
|
ADest.Draw(x-dx,y-dy,TempBitmap);
|
|
finally
|
|
SrcIntfImg.Free;
|
|
TempIntfImg.Free;
|
|
TempBitmap.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmImage.btnSaveJPEGClick(Sender: TObject);
|
|
var
|
|
jpeg: TJPEGImage;
|
|
Points: array[0..2] of TPoint;
|
|
SaveDialog: TSaveDialog;
|
|
begin
|
|
jpeg := TJPEGImage.Create;
|
|
SaveDialog := TSaveDialog.Create(nil);
|
|
try
|
|
// Create a blue triangle image
|
|
// on a black background
|
|
jpeg.Width := 100;
|
|
jpeg.Height := 100;
|
|
jpeg.Canvas.Brush.Color := clBlue;
|
|
Points[0] := Point(50, 25);
|
|
Points[1] := Point(25, 75);
|
|
Points[2] := Point(75, 75);
|
|
jpeg.Canvas.Polygon(Points);
|
|
|
|
// Prepares the save dialog and the
|
|
// compression configurations
|
|
SaveDialog.DefaultExt := 'jpg';
|
|
jpeg.CompressionQuality := trackJPEG.Position;
|
|
|
|
// Saves the file
|
|
if SaveDialog.Execute then
|
|
jpeg.SaveToFile(SaveDialog.FileName);
|
|
finally
|
|
// Releases the objects
|
|
jpeg.Free;
|
|
SaveDialog.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmImage.btnResizeClick(Sender: TObject);
|
|
var
|
|
MyBitmap: TBitmap;
|
|
begin
|
|
// Create a 100x100 bitmap and draw to it
|
|
MyBitmap := TBitmap.Create;
|
|
MyBitmap.Width := 100;
|
|
MyBitmap.Height := 100;
|
|
MyBitmap.Canvas.Brush.Color := clBlue;
|
|
MyBitmap.Canvas.Pen.Color := clBlue;
|
|
MyBitmap.Canvas.Rectangle(20, 20, 80, 80);
|
|
// Now resize it to 200x100
|
|
MyBitmap.Width := 200;
|
|
MyBitmap.Canvas.CopyRect(
|
|
Bounds(0, 0, 200, 100),
|
|
MyBitmap.Canvas,
|
|
Bounds(0, 0, 100, 100));
|
|
MyImage.Canvas.Draw(0, 0, MyBitmap);
|
|
MyBitmap.Free;
|
|
|
|
{ LCLIntf.StretchBlt(
|
|
MyBitmap.Canvas.Handle, 0, 0, 200, 100,
|
|
MyBitmap.Canvas.Handle, 0, 0, 100, 100, SRCCOPY);}
|
|
end;
|
|
|
|
procedure TfrmImage.btnRotateClick(Sender: TObject);
|
|
var
|
|
MyBitmap: TBitmap;
|
|
begin
|
|
// Create a 100x100 bitmap and draw to it
|
|
MyBitmap := TBitmap.Create;
|
|
MyBitmap.Width := 100;
|
|
MyBitmap.Height := 100;
|
|
MyBitmap.Canvas.Brush.Color := clBlue;
|
|
MyBitmap.Canvas.Pen.Color := clBlue;
|
|
MyBitmap.Canvas.Rectangle(20, 20, 80, 80);
|
|
RotateBitmap(MyBitmap, MyImage.Canvas, 0, 0, 40);
|
|
MyBitmap.Free;
|
|
end;
|
|
|
|
end.
|
|
|