Recent Posts

Selamat datang di Coding Delphi Land Weblog kumpulan source code pemogram delphi

(Bukan maksud untuk menggurui tetapi marilah kita berbagi ilmu tuk perkembangan kemajuan teknologi kita

Minggu, 15 November 2009

Flip Reverse Image

unit ScreenFlipReverseRotate;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtDlgs, ExtCtrls;

type
TFormFlipReverseRotate = class(TForm)
ImageOriginal: TImage;
ImageModified: TImage;
OpenPictureDialogBMP: TOpenPictureDialog;
CheckBoxStretch: TCheckBox;
ButtonLoad: TButton;
CheckBoxFlip: TCheckBox;
CheckBoxReverse: TCheckBox;
RadioGroupMethod: TRadioGroup;
LabelTimer: TLabel;
ButtonSave: TButton;
RadioGroupRotate: TRadioGroup;
SavePictureDialogBMP: TSavePictureDialog;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure CheckBoxStretchClick(Sender: TObject);
procedure ButtonLoadClick(Sender: TObject);
procedure CheckBoxClickModifyImage(Sender: TObject);
procedure RadioGroupRotateClick(Sender: TObject);
procedure ButtonSaveClick(Sender: TObject);
private
BitmapOriginal : TBitmap;

PROCEDURE ModifyOriginalImage;

public
{ Public declarations }
end;

var
FormFlipReverseRotate: TFormFlipReverseRotate;

implementation
{$R *.DFM}

USES
FlipReverseRotateLibrary; // FlipReverseRotate90Scanline, ...

procedure TFormFlipReverseRotate.FormCreate(Sender: TObject);
begin
// Setup BitmapOriginal in case Flip /Reverse checkboxes used before
// an image is loaded.
BitmapOriginal := TBitmap.Create;
BitmapOriginal.Width := ImageOriginal.Width;
BitmapOriginal.Height := ImageOriginal.Height;
BitmapOriginal.PixelFormat := pf24bit
end;


procedure TFormFlipReverseRotate.FormDestroy(Sender: TObject);
begin
BitmapOriginal.Free
end;


procedure TFormFlipReverseRotate.CheckBoxStretchClick(Sender: TObject);
begin
ImageOriginal.Stretch := CheckboxStretch.Checked;
ImageModified.Stretch := CheckboxStretch.Checked
end;


procedure TFormFlipReverseRotate.ButtonLoadClick(Sender: TObject);
begin
IF OpenPictureDialogBMP.Execute
THEN BEGIN
BitmapOriginal.Free;

// Create new original
BitmapOriginal := TBitmap.Create;
BitmapOriginal.LoadFromFile(OpenPictureDialogBMP.Filename);

// Assign TBitmap to TImage for display
ImageOriginal.Picture.Graphic := BitmapOriginal;

IF BitmapOriginal.PixelFormat = pf24bit
THEN BEGIN
RadioGroupMethod.ItemIndex := 0;
RadioGroupMethod.Enabled := TRUE
END
ELSE BEGIN
RadioGroupMethod.ItemIndex := 1;

// Force CopyRect to be only method available
RadioGroupMethod.Enabled := FALSE
END;

ModifyOriginalImage;
ButtonSave.Enabled := TRUE
END
end;


procedure TFormFlipReverseRotate.CheckBoxClickModifyImage(Sender: TObject);
begin
IF RadioGroupMethod.ItemIndex = 0
THEN RadioGroupRotate.Visible := TRUE
ELSE BEGIN
RadioGroupRotate.ItemIndex := 0;
RadioGroupRotate.Visible := FALSE
END;

ModifyOriginalImage
end;


// Use Scanline, CopyRect or StretchBlt to Flip or Reverse a bitmap.
// For Scanline, a "Rotate 90 degrees" option is also available.
PROCEDURE TFormFlipReverseRotate.ModifyOriginalImage;
VAR
BitmapFlipReverse: TBitmap;
BitmapRotate : TBitmap;
StartTick : INTEGER;
BEGIN
StartTick := GetTickCount;

// First Flip and/or reverse the bitmap.
// Treat BitmapFlipReverse functions much like a TBitmap.Create.
CASE RadioGroupMethod.ItemIndex OF
0: BitmapFlipReverse := FlipReverseScanLine( CheckBoxFlip.Checked,
CheckBoxReverse.Checked,
BitmapOriginal);

1: BitmapFlipReverse := FlipReverseCopyRect( CheckBoxFlip.Checked,
CheckBoxReverse.Checked,
BitmapOriginal);

2: BitmapFlipReverse := FlipReverseStretchBlt(CheckBoxFlip.Checked,
CheckBoxReverse.Checked,
BitmapOriginal);
ELSE
// Should never happen. Silence the compiler warning.
BitmapFlipReverse := NIL
END;

IF RadioGroupRotate.Visible
THEN BEGIN
// Rotate 0, 90, 180, 270 degrees counterclockwise
BitmapRotate := RotateScanLine90(90*RadioGroupRotate.ItemIndex,
BitmapFlipReverse);
ImageModified.Picture.Graphic := BitmapRotate;
BitmapRotate.Free
END
ELSE ImageModified.Picture.Graphic := BitmapFlipReverse;

// A refresh may help reduce flicker on some screens but adds quite a bit
// to the total time.
// ImageModified.Refresh;

BitmapFlipReverse.Free;

LabelTimer.Caption := IntToStr(GetTickCount - StartTick) + ' ms'
END {ModifyOriginalImage};

procedure TFormFlipReverseRotate.RadioGroupRotateClick(Sender: TObject);
begin
ModifyOriginalImage
end;

procedure TFormFlipReverseRotate.ButtonSaveClick(Sender: TObject);
begin
IF SavePictureDialogBMP.Execute
THEN ImageModified.Picture.Bitmap.SaveToFile(SavePictureDialogBMP.Filename)
end;

end.

0 komentar:

Posting Komentar