Gaussian Blur

Gaussian Blur er ganske greit å implementere, slik som de fleste filtre i Firemonkey. Det er ganske likt hver gang. OK da, noen ganger ser det ut som ulike personer har skrevet et av filtrene, men du får det greit til uten for mye fikling. Dokumentasjonen er stort sett grei på disse områdene.

Det første bildet nedenfor viser design av dialog boksen. Som vanlig har jeg to TImage bokser, en for originalen og en for resultatet. Under disse to har jeg satt inn en TTrackBar. Jeg burde kanskje satt inn et felt hvor jeg viser mengden på Blur?

Design Gaussian Blur
Design Gaussian Blur

Denne gang viser jeg ikke koden i hoved formen, koden bare jumper til «DocPage::GaussianBlur». Der ser du ganske tidlig at jeg igjen bruker en «TForm» klasse som dialogboks og kjører den med «dlgGaussianBlur->ShowModal();». Litt lenger ned ser du også at jeg klargjør for en Undo funksjon ved å legge originalbildet opp på en stack.

// --------------------------------------------------------------------------
//  				Gaussian Blur
// --------------------------------------------------------------------------
void __fastcall DocPage::GaussianBlur()
{
	try
	{
		TForm7 *dlgGaussianBlur =  new TForm7(Application);

		dlgGaussianBlur->Image1->Bitmap = Image1->Bitmap;
		dlgGaussianBlur->Caption = _T("GaussianBlur");

		dlgGaussianBlur->myGaussianBlur->Input = dlgGaussianBlur->Image1->Bitmap;
		dlgGaussianBlur->myGaussianBlur->BlurAmount = dlgGaussianBlur->TrackBar1->Value / 100;
		dlgGaussianBlur->Image2->Bitmap = dlgGaussianBlur->myGaussianBlur->Output;

		dlgGaussianBlur->ShowModal();
		if( dlgGaussianBlur -> iretState == 1 ) {

			// Don't forget the undo-stack

			UndoItem = new TUndoItem();
			UndoItem->UndoName = new String("GaussianBlur");
			UndoItem->UndoBitmap = new TBitmap();

			// Have to use "Assign()" because everything are pointers!!!

			UndoItem->UndoBitmap->Assign(Image1->Bitmap);
			mystack.push(UndoItem);

			Image1->Bitmap->Assign(dlgGaussianBlur->Image2->Bitmap);

		}

		dlgGaussianBlur->DisposeOf();
	}
	catch(...)
	{
		ShowMessage("Gaussian Blur did not succeed");
	}
}

Selve implementeringen av Blur funksjonen er også ganske enkel med en «TForm» klasse og et par små funksjoner for «OnCreate» og «TrackBar1Change».

TForm klassen:

//---------------------------------------------------------------------------

#ifndef GaussianBlurH
#define GaussianBlurH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <FMX.Controls.hpp>
#include <FMX.Forms.hpp>
#include <FMX.Controls.Presentation.hpp>
#include <FMX.StdCtrls.hpp>
#include <FMX.Types.hpp>
#include <FMX.Effects.hpp>
#include <FMX.Filter.Effects.hpp>
#include <FMX.Objects.hpp>
//---------------------------------------------------------------------------
class TForm7 : public TForm
{
__published:	// IDE-managed Components
	TImage *Image1;
	TImage *Image2;
	TTrackBar *TrackBar1;
	TButton *Cancel;
	TButton *OK;
	void __fastcall CancelClick(TObject *Sender);
	void __fastcall OKClick(TObject *Sender);
	void __fastcall TrackBar1Change(TObject *Sender);
	void __fastcall OnCreate(TObject *Sender);
private:	// User declarations
public:		// User declarations
	int iretState;
	TFilterGaussianBlur *myGaussianBlur;

	__fastcall TForm7(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm7 *Form7;
//---------------------------------------------------------------------------
#endif

TForm implementasjonen:

//---------------------------------------------------------------------------

#include <fmx.h>
#pragma hdrstop

#include "GaussianBlur.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm7 *Form7;
//---------------------------------------------------------------------------
__fastcall TForm7::TForm7(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm7::CancelClick(TObject *Sender)
{
	iretState = 0;
	Close();

}
//---------------------------------------------------------------------------
void __fastcall TForm7::OKClick(TObject *Sender)
{
	iretState = 1;
	Close();

}
//---------------------------------------------------------------------------
void __fastcall TForm7::TrackBar1Change(TObject *Sender)
{
	myGaussianBlur->BlurAmount = TrackBar1->Value / 100;
        Image2->Bitmap = myGaussianBlur->Output;

}
//---------------------------------------------------------------------------
void __fastcall TForm7::OnCreate(TObject *Sender)
{
	myGaussianBlur = new TFilterGaussianBlur(this);

	myGaussianBlur->Input = Image1->Bitmap;
	myGaussianBlur->BlurAmount = TrackBar1->Value / 100;
	Image2->Bitmap = myGaussianBlur->Output;

}
//---------------------------------------------------------------------------

Kjøring av programmet ser slik ut:

Gaussian blur1
Gaussian Blur
Gaussian Blur1
Gaussian Blur

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

Dette nettstedet bruker Akismet for å redusere spam. Lær om hvordan dine kommentar-data prosesseres.