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.