unit slide_1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, types, BGRABitmap, BGRABitmapTypes;
type
{ TForm1 }
TForm1 = class(TForm)
Show_slide_button: TButton;
Slide_panel: TPanel;
Timer1: TTimer;
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormWindowStateChange(Sender: TObject);
procedure Show_slide_buttonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
image: TBGRABitmap;
image_from : TBGRABitmap;
image_to : TBGRABitmap;
nfoto : integer;
TimerIndex : integer;
TimerStep : integer;
procedure resize_to_slide_show( work_image: TBGRABitmap; str_image : string );
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.resize_to_slide_show( work_image: TBGRABitmap; str_image : string );
var
FormVerhouding : Single;
BeeldVerhouding : Single;
SlideBreedte : Integer;
SlideHoogte : Integer;
RectSlide : TRect;
image_tmp : TBGRABitmap;
begin
try
RectSlide := TRect.Create(0,0,Slide_panel.Width,Slide_panel.Height);
// load backgroundimage to fill whole projectioncanvas
image_tmp := TBGRABitmap.Create( 'black.jpg' );
work_image.StretchPutImage(RectSlide, image_tmp, dmset, 255);
image_tmp.Free;
// get picture to be loaded
image_tmp := TBGRABitmap.Create( str_image );
// scale en ratio
FormVerhouding := Slide_panel.Width / Slide_panel.Height;
BeeldVerhouding := image_tmp.Width / image_tmp.Height;
if FormVerhouding > BeeldVerhouding then // use same height
begin
SlideHoogte := Slide_panel.Height;
SlideBreedte := Round(SlideHoogte * BeeldVerhouding);
end
else begin // use same width
SlideBreedte := Slide_panel.Width;
SlideHoogte := Round(SlideBreedte / BeeldVerhouding);
end;
if (image_tmp.Width < Slide_panel.Width) or
(image_tmp.Height < Slide_panel.Height) then
begin
image_tmp.ResampleFilter := rfBestQuality;
BGRAReplace(image_tmp, image_tmp.Resample(Slide_panel.Width, Slide_panel.Height));
end;
// center SLide
RectSlide.Left := (Slide_panel.Width - SlideBreedte) div 2;
RectSlide.Top := (Slide_panel.Height - SlideHoogte) div 2;
RectSlide.Width := SlideBreedte;
RectSlide.Height := SlideHoogte;
work_image.StretchPutImage(RectSlide, image_tmp, dmSet, 255);
finally
image_tmp.Free;
end;
end;
procedure TForm1.Show_slide_buttonClick(Sender: TObject);
var
str_foto_from, str_foto_to : string;
begin
if nfoto = 0 then
begin
str_foto_from := 'black.jpg';
str_foto_to := 'img_044000d.jpg';
end;
if nfoto = 1 then
begin
str_foto_from := 'img_044000d.jpg';
str_foto_to := 'img_045014d.jpg';
end;
if nfoto = 2 then
begin
str_foto_from := 'img_045014d.jpg';
str_foto_to := 'img_044333d.jpg';
end;
if nfoto = 3 then
begin
str_foto_from := 'img_044333d.jpg';
str_foto_to := 'img_042000d.jpg';
end;
if nfoto = 4 then
begin
str_foto_from := 'img_042000d.jpg';
str_foto_to := 'black.jpg';
end;
resize_to_slide_show( image_from, str_foto_from );
resize_to_slide_show( image_to, str_foto_to );
nfoto := nfoto + 1;
if nfoto = 5 then nfoto := 0;
// fading using crossqfade by incresing transparency-value (from 1 to 255 by step of 5
TimerIndex := 0;
TimerStep := 5;
Timer1.Enabled := True;
end;
procedure TForm1.FormWindowStateChange(Sender: TObject);
begin
image_from.SetSize(Slide_panel.Width,Slide_panel.Height);
image_to.SetSize(Slide_panel.Width,Slide_panel.Height);
image.SetSize(Slide_panel.Width,Slide_panel.Height);
image.Fill(BGRABlack);
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
Timer1.Enabled := False;
image_from.Free;
image_to.Free;
image.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
image_from := TBGRABitmap.Create( Slide_panel.Width,Slide_panel.Height );
image_to := TBGRABitmap.Create( Slide_panel.Width,Slide_panel.Height );
image := TBGRABitmap.Create( Slide_panel.Width,Slide_panel.Height );
image.Fill(BGRABlack);
nfoto := 0;
Timer1.Interval := 20;
Timer1.Enabled := False;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
image.CrossFade(Rect(0,0,image.Width, image.Height), image_from, image_to, TimerIndex, dmSet);
image.Draw(Slide_panel.Canvas, 0,0);
if TimerIndex < 255-TimerStep then
TimerIndex := TimerIndex + TimerStep
else Timer1.Enabled:=false;;
Application.ProcessMessages; // avoid to become unresponsive
end;
end.