BSOne.SFC/EM.Lib/ImageEn_SRC/Demos/ImageEditing/AnimatedGIF/uMain.pas

408 lines
11 KiB
Plaintext

unit uMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, IEMIO, StdCtrls, ImageEnView, IEMView, ImageEnIO, Buttons,
ImageEnProc, ComCtrls, ExtCtrls, IEOpenSaveDlg, ieview, iexBitmaps, hyiedefs, hyieutils;
type
TMainForm = class(TForm)
pnlGIF: TPanel;
btnFrameProps: TBitBtn;
btnInsertFrame: TBitBtn;
btnAppendFrame: TBitBtn;
btnDeleteFrame: TBitBtn;
btnPasteFrame: TBitBtn;
btnLoadFrame: TBitBtn;
IESaveDlg: TSaveImageEnDialog;
Panel3: TPanel;
pnlAnimate: TPanel;
btnAnimate: TSpeedButton;
IEMView1: TImageEnMView;
btnSaveGIF: TBitBtn;
btnLoadGIF: TBitBtn;
btnBlankGIF: TBitBtn;
chkOptimizeGIF: TCheckBox;
IEOpenDlg: TOpenImageEnDialog;
grpNewFrames: TGroupBox;
lblWidth: TLabel;
edtFrameWidth: TEdit;
updFrameWidth: TUpDown;
edtFrameHeight: TEdit;
updFrameHeight: TUpDown;
lblHeight: TLabel;
chkStretchToFrameSize: TCheckBox;
lblDelay: TLabel;
edtFrameDelay: TEdit;
updFrameDelay: TUpDown;
Label1: TLabel;
Label2: TLabel;
btnPromote: TBitBtn;
btnDemote: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure btnSaveGIFClick(Sender: TObject);
procedure btnAnimateClick(Sender: TObject);
procedure btnFramePropsClick(Sender: TObject);
procedure btnInsertFrameClick(Sender: TObject);
procedure btnAppendFrameClick(Sender: TObject);
procedure btnBlankGIFClick(Sender: TObject);
procedure btnLoadGIFClick(Sender: TObject);
procedure btnDeleteFrameClick(Sender: TObject);
procedure btnDemoteClick(Sender: TObject);
procedure btnPasteFrameClick(Sender: TObject);
procedure btnLoadFrameClick(Sender: TObject);
procedure btnPromoteClick(Sender: TObject);
procedure IEMView1GetText(Sender: TObject; Index: Integer; Position: TIEMTextPos; var Text: WideString);
procedure IEMView1Resize(Sender: TObject);
private
{ Private declarations }
fFilename: string;
function CheckHasSelection: boolean;
procedure UpdateThumbnailSize;
procedure StretchFrameToDefaultSize;
function GetDefaultFrameDelay: Integer;
function GetDefaultFrameHeight: Integer;
function GetDefaultFrameWidth: Integer;
procedure SetDefaultFrameDelay(const Value: Integer);
procedure SetDefaultFrameHeight(const Value: Integer);
procedure SetDefaultFrameWidth(const Value: Integer);
public
{ Public declarations }
property Filename: string read fFilename write fFilename;
property DefaultFrameWidth : Integer read GetDefaultFrameWidth write SetDefaultFrameWidth;
property DefaultFrameHeight : Integer read GetDefaultFrameHeight write SetDefaultFrameHeight;
property DefaultFrameDelay : Integer read GetDefaultFrameDelay write SetDefaultFrameDelay;
end;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
{$R WindowsTheme.res}
procedure TMainForm.FormCreate(Sender: TObject);
begin
IEMView1.SetModernStyling;
end;
function TMainForm.GetDefaultFrameDelay: Integer;
begin
Result := StrToIntDef(edtFrameDelay.Text, 1000);
end;
function TMainForm.GetDefaultFrameHeight: Integer;
begin
Result := StrToIntDef(edtFrameHeight.Text, 100);
end;
function TMainForm.GetDefaultFrameWidth: Integer;
begin
Result := StrToIntDef(edtFrameWidth .Text, 100);
end;
// SAVE
procedure TMainForm.btnSaveGIFClick(Sender: TObject);
var
sSaveFilename: string;
begin
try
IESaveDlg.AutoSetFilterFileType := ioGIF;
IESaveDlg.FileName := fFilename;
if IESaveDlg.Execute = false then
exit;
if chkOptimizeGIF.checked = False then
begin
IEMView1.MIO.SaveToFile(IESaveDlg.FileName);
end
else
begin
sSaveFilename := ChangeFileExt(IESaveDlg.FileName,'.tmp.gif');
IEMView1.MIO.SaveToFile(sSaveFilename);
IEOptimizeGIF(sSaveFilename, IESaveDlg.FileName);
DeleteFile(sSaveFilename);
end;
except
messagedlg('An error was encountered while saving the file: ' + IESaveDlg.FileName, mtError, [mbok], 0);
end;
end;
// PLAY
procedure TMainForm.btnAnimateClick(Sender: TObject);
var
I: Integer;
begin
UpdateThumbnailSize;
IEMView1.Playing := btnAnimate.Down;
btnFrameProps.enabled := not btnAnimate.Down;
btnInsertFrame.enabled := not btnAnimate.Down;
btnAppendFrame.enabled := not btnAnimate.Down;
btnDeleteFrame.enabled := not btnAnimate.Down;
btnPasteFrame.enabled := not btnAnimate.Down;
btnLoadFrame.enabled := not btnAnimate.Down;
grpNewFrames.enabled := not btnAnimate.Down;
chkOptimizeGIF.enabled := not btnAnimate.Down;
btnBlankGIF.enabled := not btnAnimate.Down;
btnLoadGIF.enabled := not btnAnimate.Down;
btnSaveGIF.enabled := not btnAnimate.Down;
btnDemote .enabled := not btnAnimate.Down;
btnPromote.enabled := not btnAnimate.Down;
chkStretchToFrameSize.enabled := not btnAnimate.Down;
for I := 0 to grpNewFrames.ControlCount - 1 do
grpNewFrames.Controls[i].Enabled := not btnAnimate.Down;
end;
// GIF Parameters
procedure TMainForm.btnFramePropsClick(Sender: TObject);
var
idx: Integer;
begin
if not CheckHasSelection then
exit;
IEMView1.MIO.SimplifiedParamsDialogs := False;
IEMView1.MIO.DoPreviews(IEMView1.SelectedImage, [ppGIF]);
idx := IEMView1.SelectedImage;
DefaultFrameDelay := IEMView1.MIO.Params[idx].GIF_DelayTime;
IEMView1.ImageDelayTime[idx] := 10 * IEMView1.MIO.Params[idx].GIF_DelayTime;
end;
// Insert
procedure TMainForm.btnInsertFrameClick(Sender: TObject);
var
idx: integer;
begin
idx := IEMView1.SelectedImage;
if idx < 0 then
idx := 0;
IEMView1.InsertImage(idx, DefaultFrameWidth, DefaultFrameHeight);
IEMView1.MIO.Params[idx].GIF_DelayTime := DefaultFrameDelay;
end;
// Append
procedure TMainForm.btnAppendFrameClick(Sender: TObject);
var
idx: Integer;
begin
idx := IEMView1.AppendImage(DefaultFrameWidth, DefaultFrameHeight);
IEMView1.MIO.Params[idx].GIF_DelayTime := DefaultFrameDelay;
end;
// Blank GIF
procedure TMainForm.btnBlankGIFClick(Sender: TObject);
var
sCount: string;
iCount: Integer;
I: Integer;
idx: Integer;
begin
sCount := '1';
if InputQuery('Frame Count', 'Specify the number of frames', sCount) = False then
exit;
iCount := StrToIntDef(sCount, 0);
if iCount < 1 then
begin
MessageBeep(MB_ICONEXCLAMATION);
Exit;
end;
IEMView1.Clear;
IEMView1.LockUpdate;
for I := 1 to iCount do
begin
idx := IEMView1.AppendImage(DefaultFrameWidth, DefaultFrameHeight);
IEMView1.MIO.Params[idx].GIF_DelayTime := DefaultFrameDelay;
end;
IEMView1.UnlockUpdate;
fFilename := '';
UpdateThumbnailSize;
if (IEMView1.ImageCount > 0) then
IEMView1.SelectedImage := 0;
end;
// LOAD
procedure TMainForm.btnLoadGIFClick(Sender: TObject);
begin
IEOpenDlg.AutoSetFilterFileType := ioGIF;
IEOpenDlg.FileName := fFilename;
if IEOpenDlg.Execute = false then
exit;
try
fFilename := IEOpenDlg.FileName;
IEMView1.Clear;
IEMView1.MIO.LoadFromFile(fFilename);
UpdateThumbnailSize;
if (IEMView1.ImageCount > 0) then
begin
IEMView1.SelectedImage := 0;
DefaultFrameWidth := IEMView1.ImageWidth[0];
DefaultFrameHeight := IEMView1.ImageHeight[0];
DefaultFrameDelay := IEMView1.MIO.Params[0].GIF_DelayTime;
end;
except
messagedlg('An error was encountered while loading the file: ' + fFileName, mtError, [mbok], 0);
end;
end;
// Delete Frame
procedure TMainForm.btnDeleteFrameClick(Sender: TObject);
begin
if IEMView1.SelectedImage >= 0 then
IEMView1.DeleteImage(IEMView1.SelectedImage);
end;
procedure TMainForm.btnDemoteClick(Sender: TObject);
begin
if not CheckHasSelection then
exit;
if IEMView1.SelectedImage < 1 then
MessageBeep(MB_ICONEXCLAMATION)
else
begin
IEMView1.MoveImage(IEMView1.SelectedImage, IEMView1.SelectedImage - 1);
IEMView1.SelectedImage := IEMView1.SelectedImage - 1;
end;
end;
// Paste
procedure TMainForm.btnPasteFrameClick(Sender: TObject);
begin
if not CheckHasSelection then
exit;
IEMView1.Proc.PasteFromClipboard;
if chkStretchToFrameSize.checked then
StretchFrameToDefaultSize;
end;
// Load image to frame
procedure TMainForm.btnLoadFrameClick(Sender: TObject);
begin
if not CheckHasSelection then
exit;
IEOpenDlg.AutoSetFilterFileType := -1;
IEOpenDlg.FileName := '';
if IEOpenDlg.Execute = false then
exit;
IEMView1.SetImageFromFile(IEMView1.SelectedImage, IEOpenDlg.FileName);
if chkStretchToFrameSize.checked then
StretchFrameToDefaultSize;
end;
procedure TMainForm.btnPromoteClick(Sender: TObject);
begin
if not CheckHasSelection then
exit;
if IEMView1.SelectedImage > IEMView1.ImageCount - 2 then
MessageBeep(MB_ICONEXCLAMATION)
else
begin
IEMView1.MoveImage(IEMView1.SelectedImage, IEMView1.SelectedImage + 1);
IEMView1.SelectedImage := IEMView1.SelectedImage + 1;
end;
end;
procedure TMainForm.SetDefaultFrameDelay(const Value: Integer);
begin
edtFrameDelay.Text := IntToStr(Value);
end;
procedure TMainForm.SetDefaultFrameHeight(const Value: Integer);
begin
edtFrameHeight.Text := IntToStr(Value);
end;
procedure TMainForm.SetDefaultFrameWidth(const Value: Integer);
begin
edtFrameWidth.Text := IntToStr(Value);
end;
procedure TMainForm.StretchFrameToDefaultSize;
begin
// Reduce the image size while maintaining the aspect ratio
IEMView1.Proc.Resample(DefaultFrameWidth, DefaultFrameHeight, rfLanczos3, True);
IEMView1.Proc.ImageResize(DefaultFrameWidth, DefaultFrameHeight, iehCenter, ievCenter);
end;
// Display an error if the user has not selected a fraqme
function TMainForm.CheckHasSelection: boolean;
begin
result := IEMView1.SelectedImage >= 0;
if not result then
messagedlg('You have not selected a frame.', mtError, [mbok], 0);
end;
// Choose a good size for the thumbnail display
procedure TMainForm.UpdateThumbnailSize;
const
Minimum_Size = 80;
begin
IEMView1.LockPaint;
if btnAnimate.Down then
begin
IEMView1.Scrollbars := ssNone;
IEMView1.ThumbWidth := IEMView1.ClientWidth;
IEMView1.ThumbHeight := IEMView1.ClientHeight;
IEMView1.ThumbnailsBorderWidth := 0;
end
else
begin
IEMView1.Scrollbars := ssBoth;
IEMView1.ThumbWidth := imax(Minimum_Size, DefaultFrameWidth) + 2 * IEMView1.SideGap;
IEMView1.ThumbHeight := imax(Minimum_Size, DefaultFrameHeight) + IEMView1.UpperGap + IEMView1.BottomGap;
IEMView1.ThumbnailsBorderWidth := 1;
end;
IEMView1.UnlockPaint;
end;
// Display frame info
procedure TMainForm.IEMView1GetText(Sender: TObject; Index: Integer; Position: TIEMTextPos; var Text: WideString);
begin
if btnAnimate.Down then
Text := ''
else
if (Index >= 0) and (Position = iemtpTop) then
begin
if btnAnimate.Down or (IEMView1.ThumbWidth < 120) then
Text := format('Frame %d', [Index + 1])
else
Text := format('Frame %d (%d x %d)', [Index + 1, IEMView1.ImageWidth[Index], IEMView1.ImageHeight[Index]]);
end;
end;
procedure TMainForm.IEMView1Resize(Sender: TObject);
begin
UpdateThumbnailSize;
end;
end.