You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
5.3 KiB
228 lines
5.3 KiB
unit MainForm;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
|
Dialogs, Menus, FreeBitmap, ComCtrls, ImgList, ToolWin;
|
|
|
|
type
|
|
TfwbMainForm = class(TForm)
|
|
MainMenu: TMainMenu;
|
|
mnuFile: TMenuItem;
|
|
mnuFileOpen: TMenuItem;
|
|
mnuExit: TMenuItem;
|
|
OD: TOpenDialog;
|
|
StatusBar: TStatusBar;
|
|
mnuImage: TMenuItem;
|
|
mnuImageFlip: TMenuItem;
|
|
mnuFlipHorz: TMenuItem;
|
|
mnuFlipVert: TMenuItem;
|
|
mnuConvert: TMenuItem;
|
|
mnuTo8Bits: TMenuItem;
|
|
mnuTo16Bits555: TMenuItem;
|
|
mnuTo16Bits565: TMenuItem;
|
|
mnuTo24Bits: TMenuItem;
|
|
mnuTo32Bits: TMenuItem;
|
|
mnuDither: TMenuItem;
|
|
mnuQuantize: TMenuItem;
|
|
mnuGrayScale: TMenuItem;
|
|
mnuRotate: TMenuItem;
|
|
mnuClockwise: TMenuItem;
|
|
mnuAntiClockwise: TMenuItem;
|
|
mnuInvert: TMenuItem;
|
|
mnuClear: TMenuItem;
|
|
mnuTo4Bits: TMenuItem;
|
|
tbTools: TToolBar;
|
|
btnCopy: TToolButton;
|
|
ImageList1: TImageList;
|
|
ToolButton1: TToolButton;
|
|
btnPaste: TToolButton;
|
|
btnClear: TToolButton;
|
|
btnOpen: TToolButton;
|
|
ToolButton3: TToolButton;
|
|
ToolButton4: TToolButton;
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure FormPaint(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure mnuExitClick(Sender: TObject);
|
|
procedure mnuFileOpenClick(Sender: TObject);
|
|
procedure FormResize(Sender: TObject);
|
|
procedure mnuFlipHorzClick(Sender: TObject);
|
|
procedure btnCopyClick(Sender: TObject);
|
|
procedure btnClearClick(Sender: TObject);
|
|
procedure btnPasteClick(Sender: TObject);
|
|
private
|
|
FBitmap: TFreeWinBitmap;
|
|
procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND;
|
|
public
|
|
{ Public declarations }
|
|
end;
|
|
|
|
var
|
|
fwbMainForm: TfwbMainForm;
|
|
|
|
implementation
|
|
|
|
{$R *.dfm}
|
|
|
|
uses
|
|
FreeUtils, FreeImage, Math;
|
|
|
|
procedure TfwbMainForm.FormDestroy(Sender: TObject);
|
|
begin
|
|
if Assigned(FBitmap) then
|
|
FBitmap.Free;
|
|
end;
|
|
|
|
procedure TfwbMainForm.FormPaint(Sender: TObject);
|
|
var
|
|
dx, dy, w, h: Integer;
|
|
r1, r2: Double;
|
|
R: TRect;
|
|
begin
|
|
if FBitmap.IsValid then // draw the bitmap
|
|
begin
|
|
// determine paint rect
|
|
r1 := FBitmap.GetWidth / FBitmap.GetHeight;
|
|
r2 := ClientWidth / ClientHeight;
|
|
if r1 > r2 then // fit by width
|
|
begin
|
|
w := ClientWidth;
|
|
h := Floor(w / r1);
|
|
dx := 0;
|
|
dy := (ClientHeight - h) div 2;
|
|
end
|
|
else // fit by height
|
|
begin
|
|
h := ClientHeight;
|
|
w := Floor(h * r1);
|
|
dy := 0;
|
|
dx := (ClientWidth - w) div 2;
|
|
end;
|
|
with ClientRect do
|
|
R := Bounds(Left + dx, Top + dy, w, h);
|
|
FBitmap.Draw(Canvas.Handle, R);
|
|
|
|
// erase area around the image
|
|
Canvas.Brush.Color := Color;
|
|
if dx > 0 then
|
|
begin
|
|
with ClientRect do
|
|
R := Bounds(Left, Top, dx, ClientHeight);
|
|
Canvas.FillRect(R);
|
|
with ClientRect do
|
|
R := Bounds(Right - dx, Top, dx, ClientHeight);
|
|
Canvas.FillRect(R);
|
|
end else
|
|
if dy > 0 then
|
|
begin
|
|
with ClientRect do
|
|
R := Bounds(Left, Top, ClientWidth, dy);
|
|
Canvas.FillRect(R);
|
|
with ClientRect do
|
|
R := Bounds(Left, Bottom - dy, ClientWidth, dy);
|
|
Canvas.FillRect(R);
|
|
end
|
|
end
|
|
else // clear
|
|
begin
|
|
Canvas.Brush.Color := Color;
|
|
Canvas.FillRect(ClientRect);
|
|
end
|
|
end;
|
|
|
|
procedure TfwbMainForm.FormCreate(Sender: TObject);
|
|
begin
|
|
FBitmap := TFreeWinBitmap.Create;
|
|
|
|
mnuImage.Enabled := FBitmap.IsValid;
|
|
OD.Filter := FIU_GetAllFilters;
|
|
end;
|
|
|
|
procedure TfwbMainForm.mnuExitClick(Sender: TObject);
|
|
begin
|
|
Close;
|
|
end;
|
|
|
|
procedure TfwbMainForm.mnuFileOpenClick(Sender: TObject);
|
|
var
|
|
t: Cardinal;
|
|
begin
|
|
if OD.Execute then
|
|
begin
|
|
t := GetTickCount;
|
|
FBitmap.Load(OD.FileName);
|
|
t := GetTickCount - t;
|
|
mnuImage.Enabled := FBitmap.IsValid;
|
|
StatusBar.Panels[0].Text := 'Loaded in ' + IntToStr(t) + ' msec.';
|
|
StatusBar.Panels[1].Text := Format('%dx%d', [FBitmap.GetWidth, FBitmap.GetHeight]);
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TfwbMainForm.FormResize(Sender: TObject);
|
|
begin
|
|
Invalidate
|
|
end;
|
|
|
|
procedure TfwbMainForm.WMEraseBkgnd(var Message: TMessage);
|
|
begin
|
|
Message.Result := 1;
|
|
end;
|
|
|
|
procedure TfwbMainForm.mnuFlipHorzClick(Sender: TObject);
|
|
begin
|
|
with FBitmap do
|
|
if Sender = mnuFlipHorz then
|
|
FLipHorizontal else
|
|
if Sender = mnuFlipVert then
|
|
FlipVertical else
|
|
if Sender = mnuTo4Bits then
|
|
ConvertTo4Bits else
|
|
if Sender = mnuTo8Bits then
|
|
ConvertTo8Bits else
|
|
if Sender = mnuTo16Bits555 then
|
|
ConvertTo16Bits555 else
|
|
if Sender = mnuTo16Bits565 then
|
|
ConvertTo16Bits565 else
|
|
if Sender = mnuTo24Bits then
|
|
ConvertTo24Bits else
|
|
if Sender = mnuTo32Bits then
|
|
ConvertTo32Bits else
|
|
if Sender = mnuDither then
|
|
Dither(FID_FS) else
|
|
if Sender = mnuQuantize then
|
|
ColorQuantize(FIQ_WUQUANT) else
|
|
if Sender = mnuGrayScale then
|
|
ConvertToGrayscale else
|
|
if Sender = mnuClockwise then
|
|
Rotate(-90) else
|
|
if Sender = mnuAntiClockwise then
|
|
Rotate(90) else
|
|
if Sender = mnuInvert then
|
|
Invert else
|
|
if Sender = mnuClear then
|
|
Clear;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TfwbMainForm.btnCopyClick(Sender: TObject);
|
|
begin
|
|
if FBitmap.IsValid then FBitmap.CopyToClipBoard(Handle);
|
|
end;
|
|
|
|
procedure TfwbMainForm.btnClearClick(Sender: TObject);
|
|
begin
|
|
FBitmap.Clear;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TfwbMainForm.btnPasteClick(Sender: TObject);
|
|
begin
|
|
FBitmap.PasteFromClipBoard;
|
|
Invalidate;
|
|
end;
|
|
|
|
end.
|