unit uMain; interface uses Windows, Forms, Graphics, StdCtrls, ComCtrls, Classes, Controls, imageenview, hyiedefs, hyieutils, math, iexBitmaps, iesettings, Dialogs, ExtDlgs, Menus, ExtCtrls, ieview, SysUtils, ieopensavedlg, imageenproc, iexLayers, iexRulers; type TfrmRotate = class(TForm) ImageEnView1: TImageEnView; trkRotate: TTrackBar; Timer1: TTimer; plBottom: TPanel; btnCrop: TButton; btnLoad: TButton; OpenImageEnDialog: TOpenImageEnDialog; btnSave: TButton; lblRotation: TLabel; SaveImageEnDialog: TSaveImageEnDialog; lblDegrees: TLabel; grpOptions: TGroupBox; lblSource: TLabel; cmbCropAlgorithm: TComboBox; chkGuidelines: TCheckBox; procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); procedure trkRotateChange(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure btnCropClick(Sender: TObject); procedure btnLoadClick(Sender: TObject); procedure btnSaveClick(Sender: TObject); procedure chkGuidelinesClick(Sender: TObject); procedure cmbCropAlgorithmChange(Sender: TObject); private fSourceBitmap: TIEBitmap; function GetSelectedCropAlgorithm: TIECropAlgorithm; procedure SetSelectedCropAlgorithm(const Value: TIECropAlgorithm); procedure UpdateView(); public property SelectedCropAlgorithm: TIECropAlgorithm read GetSelectedCropAlgorithm write SetSelectedCropAlgorithm; end; var frmRotate: TfrmRotate; implementation uses iexHelperFunctions; {$R *.dfm} {$R WindowsTheme.res} procedure TfrmRotate.btnCropClick(Sender: TObject); begin ShowTempHourglass; ImageEnView1.LockPaint; try ImageEnView1.IEBitmap.Assign(fSourceBitmap); ImageEnView1.Proc.RotateAndCrop( trkRotate.Position, ierBicubic, fSourceBitmap.Height / fSourceBitmap.Width, SelectedCropAlgorithm ); fSourceBitmap.Assign( ImageEnView1.IEBitmap ); trkRotate.Position := 0; finally ImageEnView1.UnLockPaint; end; end; procedure TfrmRotate.btnLoadClick(Sender: TObject); begin if OpenImageEnDialog.Execute then begin ShowTempHourglass; fSourceBitmap.Read( OpenImageEnDialog.FileName ); UpdateView; end; end; procedure TfrmRotate.FormDestroy(Sender: TObject); begin FreeAndNil(fSourceBitmap); end; procedure TfrmRotate.FormCreate(Sender: TObject); begin fSourceBitmap := TIEBitmap.Create; SelectedCropAlgorithm := iecaAngledPhoto; end; procedure TfrmRotate.btnSaveClick(Sender: TObject); begin if SaveImageEnDialog.Execute then begin ShowTempHourglass; ImageEnView1.IO.SaveToFile( SaveImageEnDialog.FileName ); end; end; procedure TfrmRotate.chkGuidelinesClick(Sender: TObject); begin IEGlobalSettings().GuidelineCount := 4; IEGlobalSettings().GridPen.Color := clSilver; IEGlobalSettings().GridPen.Style := psDot; IEGlobalSettings().GridPen.Mode := pmCopy; if chkGuidelines.checked then ImageEnView1.DisplayGridKind := iedgGuideLines else ImageEnView1.DisplayGridKind := iedgNone; end; procedure TfrmRotate.cmbCropAlgorithmChange(Sender: TObject); begin UpdateView(); end; function TfrmRotate.GetSelectedCropAlgorithm: TIECropAlgorithm; begin Result := TIECropAlgorithm( cmbCropAlgorithm.ItemIndex ); end; procedure TfrmRotate.SetSelectedCropAlgorithm(const Value: TIECropAlgorithm); begin cmbCropAlgorithm.ItemIndex := ord( value ); end; procedure TfrmRotate.Timer1Timer(Sender: TObject); begin UpdateView; end; procedure TfrmRotate.trkRotateChange(Sender: TObject); begin Timer1.Enabled := False; Timer1.Enabled := True; end; procedure TfrmRotate.UpdateView(); begin if ImageEnView1.IEBitmap.IsEmpty() then exit; Timer1.Enabled := False; ImageEnView1.LockUpdate; try ImageEnView1.IEBitmap.Assign( fSourceBitmap ); lblDegrees.Caption := IntToStr( trkRotate.Position ) + '°'; ImageEnView1.Proc.RotateAndCrop( trkRotate.Position, ierNone, fSourceBitmap.Height / fSourceBitmap.Width, SelectedCropAlgorithm ); finally ImageEnView1.UnlockUpdate; end; end; end.