//
unit ads_ImageLib;
{Copyright(c)2016 Advanced Delphi Systems
Richard Maley
Advanced Delphi Systems
12613 Maidens Bower Drive
Potomac, MD 20854 USA
phone 301-840-1554
dickmaley@advdelphisys.com
The code herein can be used or modified by anyone. Please retain references
to Richard Maley at Advanced Delphi Systems. If you make improvements to the
code please send your improvements to dickmaley@advdelphisys.com so that the
entire Delphi community can benefit. All comments are welcome.
}
(*UnitIndex Master Index Implementation Section Download UnitsDescription: ads_ImageLib.pas This unit contains the following routines.
IL_SaveAs_1 IL_SaveAs_2 IL_SaveAsDlg ResizeImageBestFit ResizeImageKeepProportions
*)
interface
Uses
Windows,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
TMultiP
;
Function ResizeImageBestFit(
PMultiImage : TPMultiImage;
Height : Integer;
Width : Integer): Boolean;
Function ResizeImageKeepProportions(
PMultiImage : TPMultiImage;
NewDimension : Integer;
IsWidth : Boolean): Boolean;
Function IL_SaveAsDlg(
PMultiImage : TPMultiImage;
Quality : Integer): Boolean;
Function IL_SaveAs(
PMultiImage : TPMultiImage;
inQuality : Integer;
sgFileName : String;
sgExt : String;
sgFileDir : String): Boolean; OverLoad;
Function IL_SaveAs(
PMultiImage : TPMultiImage;
inQuality : Integer;
FileName : String): Boolean; OverLoad;
implementation
uses
ads_Exception;
Var
UnitName : String = 'ads_ImageLib';
ProcName : String = 'Unknown';
//Unit Description UnitIndex Master Index
Function IL_SaveAs(
PMultiImage : TPMultiImage;
inQuality : Integer;
sgFileName : String;
sgExt : String;
sgFileDir : String): Boolean;
Var
sgFullFile : String;
begin
Result := False;
ProcName := 'IL_SaveAs'; Try
Try
PMultiImage.JPegSaveQuality := inQuality;
If Copy(sgFileDir,Length(sgFileDir),1) <> '\' Then
sgFileDir := sgFileDir + '\';
sgExt := UpperCase(sgExt);
sgFullFile := sgFileDir + sgFileName;
screen.cursor := crHourGlass;
If sgExt = '.BMP' Then PMultiImage.SaveAsBMP(sgFullFile);
If sgExt = '.EPS' Then PMultiImage.SaveAsEPS(sgFullFile);
If sgExt = '.GIF' Then PMultiImage.SaveAsGIF(sgFullFile);
If sgExt = '.JPEG' Then PMultiImage.SaveAsJpg(sgFullFile);
If sgExt = '.JPG' Then PMultiImage.SaveAsJpg(sgFullFile);
If sgExt = '.PCX' Then PMultiImage.SaveAsPcx(sgFullFile);
If sgExt = '.PNG' Then PMultiImage.SaveAsPNG(sgFullFile);
If sgExt = '.TGA' Then PMultiImage.SaveAsTGA(sgFullFile);
If sgExt = '.TIF' Then PMultiImage.SaveAsTIF(sgFullFile);
If sgExt = '.SCM' Then PMultiImage.SaveCurrentMessage(sgFullFile);
If sgExt = '.CMS' Then PMultiImage.SaveCurrentCreditMessage(sgFullFile);
PMultiImage.ImageName := sgFullFile;
screen.cursor:=crDefault;
Result := True;
Except
Result := False;
Raise;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E);End;
end;
//Unit Description UnitIndex Master Index
Function IL_SaveAsDlg(
PMultiImage : TPMultiImage;
Quality : Integer): Boolean;
Var
sgFileName : String;
sgExt : String;
sgFileDir : String;
SaveDialog : TSaveDialog;
begin
Result := False;
ProcName := 'IL_SaveAsDlg'; Try
SaveDialog := TSaveDialog.Create(nil);
Try
sgFileDir := ExtractFileDir(PMultiImage.ImageName);
If Copy(sgFileDir,Length(sgFileDir),1) <> '\' Then
sgFileDir := sgFileDir + '\';
sgFileName := ExtractFileName(PMultiImage.ImageName);
sgExt := UpperCase(ExtractFileExt(sgFileName));
SaveDialog.InitialDir := sgFileDir;
If PMultiImage.BFileType = 'SCM' Then
Begin
SaveDialog.Filename:='*.SCM';
SaveDialog.Filter:='Scroll message|*.scm';
End
Else
Begin
If PMultiImage.BFileType = 'CMS' Then
Begin
SaveDialog.Filename := '*.CMS';
SaveDialog.Filter := 'Credit message|*.cms';
End
Else
Begin
SaveDialog.Filename := sgFileName;
SaveDialog.Filter :='jpeg|*.jpg|bmp|*.bmp|gif|*.gif|pcx|*.pcx|png|*.png|tif|*.tif|tga|*.tga|eps|*.eps';
If (sgExt = '.JPG') Or (sgExt = '.JPEG') Then SaveDialog.FilterIndex := 1;
If (sgExt = '.BMP') Then SaveDialog.FilterIndex := 2;
If (sgExt = '.GIF') Then SaveDialog.FilterIndex := 3;
If (sgExt = '.PCX') Then SaveDialog.FilterIndex := 4;
If (sgExt = '.PNG') Then SaveDialog.FilterIndex := 5;
If (sgExt = '.TIF') Then SaveDialog.FilterIndex := 6;
If (sgExt = '.TIFF') Then SaveDialog.FilterIndex := 6;
If (sgExt = '.TGA') Then SaveDialog.FilterIndex := 7;
If (sgExt = '.EPS') Then SaveDialog.FilterIndex := 8;
End;
End;
If SaveDialog.execute Then
Begin
sgFileDir := ExtractFileDir(SaveDialog.FileName);
If Copy(sgFileDir,Length(sgFileDir),1) <> '\' Then
sgFileDir := sgFileDir + '\';
sgFileName := ExtractFileName(SaveDialog.FileName);
sgExt := UpperCase(ExtractFileExt(sgFileName));
Result :=
IL_SaveAs(
PMultiImage, //PMultiImage : TPMultiImage;
Quality , //inQuality : Integer;
sgFileName , //sgFileName : String;
sgExt , //sgExt : String;
sgFileDir );//sgFileDir : String): Boolean;
End;
Finally
SaveDialog.Free;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E);End;
end;
//Unit Description UnitIndex Master Index
Function ResizeImageKeepProportions(
PMultiImage : TPMultiImage;
NewDimension : Integer;
IsWidth : Boolean): Boolean;
Var
inWidthOld : Integer;
inWidthNew : Integer;
inHeightOld : Integer;
inHeightNew : Integer;
Bitmap : TBitmap;
boStretch : Boolean;
begin
Result := False;
ProcName := 'ResizeImageKeepProportions'; Try
boStretch := PMultiImage.StretchRatio;
Bitmap := TBitmap.Create;
Try
Try
{Set Stretch Off}
PMultiImage.StretchRatio := False;
{Create a new bitmap and set its size}
inWidthOld := PMultiImage.Picture.Bitmap.Width;
inHeightOld := PMultiImage.Picture.Bitmap.Height;
If IsWidth Then
Begin
inWidthNew := NewDimension;
inHeightNew := (inHeightOld * inWidthNew) div inWidthOld;
End
Else
Begin
inHeightNew := NewDimension;
inWidthNew := (inWidthOld * inHeightNew) div inHeightOld;
End;
Bitmap.Width := inWidthNew;
Bitmap.Height := inHeightNew;
{Copy the palette}
Bitmap.Palette:=PMultiImage.Picture.Bitmap.Palette;
{Delete the lines needed to shrink}
SetStretchBltMode(Bitmap.Canvas.Handle,STRETCH_DELETESCANS);
{Resize it}
Bitmap.Canvas.Copyrect(Rect(0,
0,
inWidthNew,
inHeightNew),
PMultiImage.Picture.Bitmap.Canvas,
Rect(0,
0,
PMultiImage.Picture.Bitmap.Width,
PMultiImage.Picture.Bitmap.Height));
{Copy the palette}
Bitmap.Palette:=PMultiImage.Picture.Bitmap.Palette;
{Assign the new smaller bitmap}
PMultiImage.Picture.Bitmap.Assign(Bitmap);
{Free the bitmap}
Result := True;
Except
Result := False;
Raise;
End;
Finally
Bitmap.Free;
PMultiImage.StretchRatio := boStretch;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E);End;
end;
//Unit Description UnitIndex Master Index
Function ResizeImageBestFit(
PMultiImage : TPMultiImage;
Height : Integer;
Width : Integer): Boolean;
Var
inWidthOld : Integer;
inHeightOld : Integer;
boStretch : Boolean;
IsWidth : Boolean;
NewDimension : Integer;
begin
Result := False;
ProcName := 'ResizeImageBestFit'; Try
boStretch := PMultiImage.StretchRatio;
Try
Try
PMultiImage.StretchRatio := False;
inWidthOld := PMultiImage.Picture.Bitmap.Width;
inHeightOld := PMultiImage.Picture.Bitmap.Height;
IsWidth := (((inHeightOld * Width) div inWidthOld)<=Height);
If IsWidth Then
Begin
NewDimension := Width;
End
Else
Begin
NewDimension := Height;
End;
Result :=
ResizeImageKeepProportions(
PMultiImage , //PMultiImage : TPMultiImage;
NewDimension , //NewDimension : Integer;
IsWidth ); //IsWidth : Boolean): Boolean;
Except
Result := False;
Raise;
End;
Finally
PMultiImage.StretchRatio := boStretch;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E);End;
end;
//Unit Description UnitIndex Master Index
Function IL_SaveAs(
PMultiImage : TPMultiImage;
inQuality : Integer;
FileName : String): Boolean; OverLoad;
Var
sgFileName : String;
sgExt : String;
sgFileDir : String;
Begin
Result := False;
ProcName := 'IL_SaveAs'; Try
sgFileName := ExtractFileName(FileName);
sgExt := ExtractFileExt(FileName);
sgFileDir := ExtractFileDir(FileName);
Result :=
IL_SaveAs(
PMultiImage , //PMultiImage : TPMultiImage;
inQuality , //inQuality : Integer;
sgFileName , //sgFileName : String;
sgExt , //sgExt : String;
sgFileDir ); //sgFileDir : String): Boolean; OverLoad;
Except On E : Exception Do RaiseError(UnitName,ProcName,E);End;
End;
end.
//