Radial Blur i RAD Studio

Dette er mitt siste eksempel på blurring, radial blur, i RAD Studio. Heller ikke denne gang går jeg inn på den egentlige matematiske løsningen, men bare praktisk løsning i FireMonkey.

Designmessig er løsningen på radial blur ganske lik de andre metodene: 2 TImage, en for originalen og en for resultatet. Deretter en TTrackbar og to TButtons.

Radial blur i rad studio
Radial Blur i RAD Studio

Blur-klassen og implementeringen av denne er ganske grei, slik som tidligere blur-klasser. Du ser antagelig at det meste er kopiert fra andre blur-klasser, ved kode som er endret til kommentarer 🙂

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

#ifndef RadialBlurH
#define RadialBlurH
//---------------------------------------------------------------------------
#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 TForm9 : public TForm
{
__published:	// IDE-managed Components
	TImage *Image1;
	TImage *Image2;
	TTrackBar *TrackBar1;
	TButton *Cancel;
	TButton *OK;
	void __fastcall OnCreate(TObject *Sender);
	void __fastcall TrackBar1Change(TObject *Sender);
	void __fastcall CancelClick(TObject *Sender);
	void __fastcall OKClick(TObject *Sender);
private:	// User declarations

public:		// User declarations
	int iretState;
	//TFilterSharpen * MySharpenFilter;
	//TFilterGaussianBlur *myGaussianBlur;
	//TFilterBoxBlur *myBoxBlur;
	TFilterRadialBlur *myRadialBlur;

	__fastcall TForm9(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm9 *Form9;
//---------------------------------------------------------------------------
#endif

De samme kommentarene gjelder også for implementeringen: Kodelinjer som er kommentert bort:

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

#include <fmx.h>
#pragma hdrstop

#include "RadialBlur.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm9 *Form9;
//---------------------------------------------------------------------------
__fastcall TForm9::TForm9(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm9::OnCreate(TObject *Sender)
{
	//myGaussianBlur = new TFilterGaussianBlur(this);
	//myBoxBlur = new TFilterBoxBlur(this);
	myRadialBlur = new TFilterRadialBlur(this);

	myRadialBlur->Input = Image1->Bitmap;
	myRadialBlur->BlurAmount = TrackBar1->Value / 10;
	Image2->Bitmap = myRadialBlur->Output;

}
//---------------------------------------------------------------------------
void __fastcall TForm9::TrackBar1Change(TObject *Sender)
{
	myRadialBlur->BlurAmount = TrackBar1->Value / 10;
    Image2->Bitmap = myRadialBlur->Output;

}
//---------------------------------------------------------------------------
void __fastcall TForm9::CancelClick(TObject *Sender)
{
	iretState = 0;
	Close();

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

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

I Doc-klassen finnes kun funksjonen for radial blur. Deklarasjonen for denne viser jeg ikke denne gang, men kanskje implementeringen? Denne er helt lik de andre funksjonene:

// --------------------------------------------------------------------------
//  				Radial Blur
// --------------------------------------------------------------------------

void __fastcall DocPage::RadialBlur()
{
	try
	{
		TForm9 *dlgRadialBlur =  new TForm9(Application);

		dlgRadialBlur->Image1->Bitmap = Image1->Bitmap;
		dlgRadialBlur->Caption = _T("RadialBlur");

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


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

			// Don't forget the undo-stack

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

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

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

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

		}

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

}

Så endelig, et par bilder fra kjøring av programmet.

Radial blur  ved runtime 1
Radial Blur i RAD Studio ved runtime
Radial blur i rad studio ved runtime
Radial Blur i RAD Studio ved runtime

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.