Flex Formatter plugin (FlexPrettyPrint)

If you want to automate a code review process regarding coding convention then you can install Flex Formatter plugin in FlexBuilder or eclipse and then configure formatting for ActionScript and MXML with help of coding convention checklist document (example of ActionScript coding convention checklist).

Update Site URL – http://flexformatter.googlecode.com/svn/trunk/FlexFormatter/FlexPrettyPrintCommandUpdateSite

After installing you will be able to configure formatting in Preferences window and to export properties files to share them with your team or to import in an other projects.

Flex Formatting Preferences

Then when you save a file or perform a predefined key combination for formatting all code will be formatted automatically. This will save a lot of time for you and your team members.

Installing Ant in Flex Builder 3

I was trying to install Ant in Flex Builder 3 using steps described here.

But after step ‘Click “Install all” to install Java Development Tools’ I got such errors:

Unable to complete action for feature “Eclipse Platform” due to errors.
Unable to complete action for feature “Eclipse RCP” due to errors.
Unable to create file “/C:/Program Files/Adobe/Flex Builder 3/plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.3.R33x_v20080118\META-INF/eclipse.inf”. [C:\Program Files\Adobe\Flex Builder 3\plugins\org.eclipse.equinox.launcher.win32.win32.x86_1.0.3.R33x_v20080118\META-INF\eclipse.inf (Access denied)]

If you have Windows Vista then you can fix the problem this way:

1. Close FlexBuilder

2. Run FlexBuilder as administrator.

3. Repeat Ant installation steps again.

ActionScript coding convention checklist

Here is a checklist which I think is useful when you need to review your ActionScript code.

Also I’m adding an example.zip with ‘CheckList Template.docx’ file, ‘CodeConventionClass.as’ file and ‘CodeConventionClass Attachment.xlsx’. (Please do not forget to change extension from .doc to .zip after downloading).

1. English grammar and spelling.
2. Copyright comment is added and used /**   */ format.  Copyright comment includes such information as: a year of company foundation – current year, company name and “All rights reserved” string.

/**

* Copyright 1991-2010 Company Name. All rights reserved

*/

3. Package names must use “reverse domain” naming convention.

4. Braces “{“ and “}” are placed on separate line.

5. Organize imports by sections. Separate sections with empty line.

6. Imports don’t contain unnecessary classes or packages.

7. Class comment is added and used /**   */ format. Class comments should include class purpose and author.

8. Each author in Class comment should be placed on a new line. If you are the person who is modifying somebody’s class then you can do this way:

@author Name Surname (modified).

9. Class name is in UpperCamel format.

10. Constants are placed using priority order – public, private.

11. Base variables section has priority order – public, private.

12. Private variables must start with an underscore “_”.

13. Boolean variables should start with “is”.

14. Public variables must not contain underscore “_”.

15. Used one empty line between separate variables sections.

16. Used two empty lines before Constructor.

17. Method comments are added and used /**   */ format. Description for parameters and returned value is added.

18. Meaningful constants are used in compound, while and dowhile, switch statements instead of using just a value.

19. Added a space after “(“ and before “)”. And a space is added only after “:” character.

20. Types declaration used for variables and parameters declaration conforms.

21. Copy-Paste style of coding avoided.

22. Code organized according to system design.

23. Event listeners names should start with event dispatcher name, then event type and then key word “Handler” (getItemActionResultHandler, btnSaveClickHandler) .

24. Comment of handlers’ methods is started from a word “Handles” and a description for transferred parameter is added.

/**

* Handles socket connection

* @param e – Event.CONNECT

*/

25. Parameters in methods must not start from underscore “_” or “$”.

26. All added event listeners should be removed when not used anymore.

27. Resources are removed if they are not used anymore to free memory. Example, when window is closed.

28. Keyword ‘this’ is used to address methods and variables. Using thiskeyword allows us to distinguish global variables from local and to see calling of methods through a lot of strings in a class.

29. Complex constructions and long methods avoided.

30. Code is consistent to system design and approaches.

31. Avoid using public variables in general, as it does not properly encapsulate the software design; instead use getter/setter conventions.

32. Public fields and methods used only when necessary.

33. Usage of design patterns only when needed.

34.trace statements are removed or commented.

Flex 4 localization example.

At this post we will find out how to create a simple languages panel in a Flash Builder which will allow to switch between English and Russian languages. After clicking flag icon language of Label and toolTips should be changed (see img. 6).

Img. 1 - LanguagesPanel component

1. Create our localization files

Img. 2 - Example of location of languages files

2. Input data into each of localization.properties file. Text encoding of the files should be Unicode, UTF-8.

Img. 3 - Example of localization.properties file for English language
Img. 4 - Example of localization.properties file for Russian language

3. Modify properties of the project. In right-mouse menu choose Properties – > Flex Compiler.

Img. 5 - Flex Compiler properties

Set additional compiler arguments to:

-locale=ru_RU,en_US -source-path=locale/{locale} -allow-source-path-overlap=true

4. Create our component – LanguagesPicker.mxml.

xml version=”1.0″ encoding=”utf-8″?>

<s:Group xmlns:fx=”http://ns.adobe.com/mxml/2009

xmlns:s=”library://ns.adobe.com/flex/spark

xmlns:mx=”library://ns.adobe.com/flex/mx“>

<s:layout>

HorizontalLayout verticalAlign=”middle” horizontalAlign=”right” gap=”5″/>

</s:layout>

<fx:Declarations>

<!– Place non-visual elements (e.g., services, value objects) here –>
<mx:Glow id=”glowEffect” blurXTo=”1.25” blurYTo=”1.25 />

</fx:Declarations>

<fx:Style>

@namespace s “library://ns.adobe.com/flex/spark”;
@namespace mx “library://ns.adobe.com/flex/mx”;

.flagStyle
{

skin: ClassReference(null);

}

</fx:Style>

<fx:Metadata>

[ResourceBundle(“localization”)]

</fx:Metadata>

<fx:Script>

<!–[CDATA[–>

import core.Constants;
import core.EmbeddedItemsStorage;
import events.ChangeEvent;
import mx.events.FlexEvent;
import mx.events.ListEvent;

protected function btn_En_clickHandler(event:MouseEvent):void
{

this.resourceManager.localeChain = [“en_US”];

}

protected function btn_Ru_clickHandler(event:MouseEvent):void
{

this.resourceManager.localeChain = [“ru_RU”];

}

]]>

</fx:Script>

<s:Label id=”label

text=”{resourceManager.getString(Constants.BUNDLE_NAME, ‘LANGS_PICKER_LABEL’)}

textAlign=”right” verticalAlign=”middle/>

LinkButton id=”btn_En

icon=”{EmbeddedItemsStorage.EN_US_FLAG}

toolTip=”{resourceManager.getString(Constants.BUNDLE_NAME, ‘ENGLISH’)}

click=”btn_En_clickHandler(event)” mouseDownEffect=”{this.glowEffect}

styleName=”flagStyle” width=”32” height=”32/>

LinkButton id=”btn_Ru

icon=”{EmbeddedItemsStorage.RU_FLAG}

toolTip=”{resourceManager.getString(Constants.BUNDLE_NAME, ‘RUSSIAN’)}

click=”btn_Ru_clickHandler(event)” mouseDownEffect=”{this.glowEffect}

styleName=”flagStyle” width=”32” height=”32/>

</s:Group>

Comment:

Please notice that in this example

1) bundleName was moved into Constants class

public class Constants
{

public static const BUNDLE_NAME: String = “localization”;

}

2) icons were embedded using EmbeddedItemsStorage class

public class EmbeddedItemsStorage
{

// Images
[Embed(source=“/assets/flags/Ru_flag_32x32.png”)]
public static const RU_FLAG: Class;

[Embed(source=“/assets/flags/US_flag_32x32.png”)]
public static const EN_US_FLAG: Class;

}

5. Run application and test results

Img. 6 - Example after switching to Russian language

Updating language for dataProvider of some component.

Let’s look at example when you need to update strings of ToggleButtonBar which is placed at your application component.

Img. 7 - ToggleButtonBar with English labels

1. Add new strings into localization.properties files

# locale/en_US/localization.properties
LANGS_PICKER_LABEL=Choose a language:
ENGLISH=English
RUSSIAN=Russian
MENU_MONETARY_TRANSACTIONS=Monetary transactions
MENU_TIME=Time

# locale/ru_RU/localization.properties
LANGS_PICKER_LABEL=Выберите язык:
ENGLISH=Английский
RUSSIAN=Русский
MENU_MONETARY_TRANSACTIONS=Денежные операции
MENU_TIME=Время

2. Modify LanguagesPicker.mxml to to send LANG_UPDATE event after localeChain changing.

protected function btn_En_clickHandler(event:MouseEvent):void
{

this.resourceManager.localeChain = [“en_US”];
this.dispatchEvent(new ChangeEvent(ChangeEvent.LANG_UPDATE));

}

protected function btn_Ru_clickHandler(event:MouseEvent):void
{

this.resourceManager.localeChain = [“ru_RU”];
this.dispatchEvent(new ChangeEvent(ChangeEvent.LANG_UPDATE));

}

Comment:

ChangeEvent extends Event class and contains a constant for LanguageUpdate string.

public class ChangeEvent extends Event
{

public static const LANG_UPDATE: String = “LanguageUpdate”;

3. Place ToggleButtonBar component in your application mxml component and set its properties.

ToggleButtonBar id=”toggleBtnBar

dataProvider=”{this.dpToggleBtnBar}

itemClick=”toggleBtnBar_itemClickHandler(event)”

maxHeight.MonetaryTransactions=”80″ maxHeight.HeaderMenu=”80″ maxHeight.TimeState=”80″/>

4. Define a getter for dataProvider of ToggleButtonBar component in ActionScript section of your application.

public function get dpToggleBtnBar():ArrayCollection
{

var arr: ArrayCollection = new ArrayCollection();

var money: Object = new Object();
money.data = “MonetaryTransactions”;
money.label = resourceManager.getString(Constants.BUNDLE_NAME, ‘MENU_MONETARY_TRANSACTIONS’);

arr.addItem(money);

var time: Object = new Object();
time.data = “TimeState”;
time.label = resourceManager.getString(Constants.BUNDLE_NAME, ‘MENU_TIME’);

arr.addItem(time);

return arr;

}

5. For you application add creationComplete event handler and add listener for LANG_UPDATE event of langsPicker component. When LANG_UPDATE event will be dispatched then you need to update dataProvider of ToggleButtonBar component.

protected function application_creationCompleteHandler(event:FlexEvent):void
{

this.langsPicker.addEventListener(ChangeEvent.LANG_UPDATE, this.updateStrings);

}

private function updateStrings(e: ChangeEvent):void
{

this.toggleBtnBar.dataProvider = this.dpToggleBtnBar;

}

6. Run your application and test results.

Img. 8 - ToggleButtonBar component with Russian labels

Flex4 ToggleButtonBar with icons. Switching between states using ToggleButtonBar.

Example for Flash Builder.

ToggleButtonBar contains Home and Downloads buttons (img. 1 and img. 2) which should present icons and allow to switch between states.

This slideshow requires JavaScript.

<s:states>

<s:State name=”HomeState/>

<s:State name=”DownloadsState/>

</s:states>

<fx:Script>
<!–[CDATA[–>

import mx.events.ItemClickEvent;

protected function toggleBtnBar_itemClickHandler(event:ItemClickEvent):void
{

this.currentState = event.item.data;

}

]]>
</fx:Script>

<fx:Declarations>

<!– Place non-visual elements (e.g., services, value objects) here –>
<fx:Array id=”menuDataProvider”>

<fx:Object data=”HomeState

label=”Home

icon=”@Embed(source=’/assets/menu_icons/home.png’)/>

<fx:Object data=”DownloadsState

label=”Downloads

icon=”@Embed(source=’/assets/menu_icons/downloads.png’)/>

</fx:Array>

</fx:Declarations>

ToggleButtonBar id=”toggleBtnBar

iconField=”icon”

dataProvider=”{menuDataProvider}

itemClick=”toggleBtnBar_itemClickHandler(event)” />

Flex4 ToggleButtonBar c иконками. Переключение состояний при помощи ToggleButtonBar.

Пример для Flash Builder.

ToggleButtonBar будет содержать 2 кнопки – Home и Downloads (рис. 1 и рис. 2), которые должны отображать соответствующую иконку и переключаться между состояниями.

Рис. 1 - Пример HomeState

Рис. 2 - Пример DownloadsState

<s:states>

<s:State name=“HomeState”/>

<s:State name=“DownloadsState”/>

</s:states>

<fx:Script>
<!–[CDATA[–>

import mx.events.ItemClickEvent;

protected function toggleBtnBar_itemClickHandler(event:ItemClickEvent):void
{

this.currentState = event.item.data;

}

]]>
</fx:Script>

<fx:Declarations>

<!– Place non-visual elements (e.g., services, value objects) here –>
<fx:Array id=”menuDataProvider”>

<fx:Object data=”HomeState

label=”Home

icon=”@Embed(source=’/assets/menu_icons/home.png’)/>

<fx:Object data=”DownloadsState

label=”Downloads

icon=”@Embed(source=’/assets/menu_icons/downloads.png’)/>

</fx:Array>

</fx:Declarations>

<mx:ToggleButtonBar id=”toggleBtnBar

iconField=”icon

dataProvider=”{menuDataProvider}

itemClick=”toggleBtnBar_itemClickHandler(event)” />

Покращення зображень за допомогою математичного пакета MathLab

Мета:

  • ознайомитися із базовими функціями обробки зображень у пакеті МАТЛАБ;
  • вивчити засоби покращення зображень;
  • ознайомитися із стандартними методами обробки гістограм;
  • вивчити типи шумів на зображенні;
  • навчитись видаляти шуми.

Порядок виконання роботи

1. Створимо новий M-File та завантажимо зображення за допомогою стандартного діалогу операційної системи

pathDat=([cd ‘work*.jpg’]);
[filename, pathname] = uigetfile(pathDat);
fullname=strcat(pathname, filename);
I=imread(fullname);
iptsetpref(‘ImshowAxesVisible’,‘on’)
figure;
imshow(I);

Виконуємо команду Debug/Save and run. На екрані повинно з’явитися вікно для обрання зображення “Select File to Open”. Обираємо файл та відкриваємо його.

2. Розглянемо приклад обробки тестового зображення МАТЛАБ. Спочатку треба загрузити його, а потім проаналізуємо його гістограму. Для цього необхідно виконати команди

I = imread(‘cameraman.tif’);
imshow(I);
figure, imhist(I)

Після виконання команди Debug/Save and run на екрані з’являється зображення (рис. 1). Як бачимо, це зображення світле.

Рис. 1 – Тестове зображення та його гістограма яскравості

Гістограма зображення широка, тобто діапазон значень яскравостей великий. Спробуємо ще більше покращити якість зображення за допомогою функції imadjust.

I = imread(‘cameraman.tif’);
imshow(I);
figure, imhist(I)

I1 = imadjust(I);
imshow(I1)
figure, imhist(I1)

Після виконання команди Debug/Save and run на екрані з’являється зображення (рис. 2).

Можна помітити, що зовнішній вигляд гістограми майже не змінився, окрім того, що вона стала більш розтягнута, діапазон значень став більше. Це призводить по появи нових яскравостей, і в свою чергу до покращення зображення.

Рис. 2 - Результат покращення гістограми

Спробуємо до вихідного зображення застосувати іншу функцію обробки гістограми histeq. Результати покращення гістограми приведений на рис. 3.

I = imread(‘cameraman.tif’);
imshow(I);
figure, imhist(I)

I1 = imadjust(I);
imshow(I1)
figure, imhist(I1)

I2 = histeq(I);
imshow(I2)
figure, imhist(I2)

Рис. 3 – Результат застосування функції histeq

Розглянемо тепер функцію adapthisteq. Приклад її застосування приведено нижче.

I = imread(‘cameraman.tif’);
imshow(I);
figure, imhist(I)

I1 = imadjust(I);
imshow(I1)
figure, imhist(I1)

I2 = histeq(I);
imshow(I2)
figure, imhist(I2)

I3 = adapthisteq(I);
imshow(I3)
figure, imhist(I3)

Рис. 4 - Результат застосування функції adapthisteq

3. Розглянемо приклади видалення шумів на фотографіях. Завантажимо тестову фотографію та додамо на неї шум типу «сіль та перець». Зробимо це за допомогою коду:

I = imread(‘eight.tif’);
imshow(I)
J = imnoise(I,‘salt & pepper’,0.02);
figure, imshow(J)

Рис. 5 – Комбінація зображення та шуму «salt&pepper»

Спробуємо тепер відфільтрувати зашумлене зображення за допомогою функцій МАТЛАБ.

L = medfilt2(J,[3 3]);
figure, imshow(L)

Завантажимо тестову фотографію та додамо на неї шум типу «gaussian».

I = imread(‘eight.tif’);
imshow(I)
J = imnoise(I,‘gaussian’,0.02);
figure, imshow(J)

Рис. 6 - Результат використання параметру «gaussian»

Завантажимо тестову фотографію та додамо на неї шум типу «poisson».

I = imread(‘eight.tif’);
imshow(I)
J = imnoise(I, ‘poisson’);
figure, imshow(J)

Рис. 7 - Результат використання параметру «poisson»

Завантажимо тестову фотографію та додамо на неї шум типу «speckle».

I = imread(‘eight.tif’);
imshow(I)
J = imnoise(I, ‘speckle’, 0.6);
figure, imshow(J)

Рис. 8 – Результат використання параметру «speckle»

4. Розглянемо роботу функцій imsubtract, imadd, imabsdiff, im2bw, rgb2gray.

іmsubtract – віднімає одне зображення з іншого або константу з зображення.

Z = imsubtract(X,Y)

Віднімемо фонове зображення.

I = imread(‘rice.png’);
figure, imshow(I);
background = imopen(I,strel(‘disk’,15));
Ip = imsubtract(I,background);
figure, imshow(Ip,[])

Рис. 9 – Результат віднімання фону від зображення

Віднімемо константне значення з зображення.

I = imread(‘rice.png’);
figure, imshow(I);
background = imopen(I,strel(‘disk’,15));
Ip = imsubtract(I,background);
figure, imshow(Ip,[])

Iq = imsubtract(I,60);
figure, imshow(Iq)

Рис. 10 – Результат віднімання константного значення від зображення

іmadd – складає два зображення або додає константу до зображення

Z = imadd(X,Y)

Складемо два зображення  та визначимо вихідний клас.

I = imread(‘rice.png’);
J = imread(‘cameraman.tif’);
K = imadd(I,J,‘uint16’);
imshow(K,[])

Рис. 11 – Результат складання двух зображень

I1 = imread(‘rice.png’);
J1 = imadd(I1,50);
subplot(1,2,1), imshow(I)
subplot(1,2,2), imshow(J)

Рис. 12 – Результат додавання константного значення до зображення

іmabsdiff визначає абсолютну відмінність двох зображень.

Z = imabsdiff(X,Y)

Виведемо абсолютну різницю між відфільтрованим зображенням та оригіналом.

I = imread(‘cameraman.tif’);
J = uint8(filter2(fspecial(‘gaussian’), I));
K = imabsdiff(I,J);
imshow(K,[]) % [] = scale data automatically

Рис. 13 – Абсолютна різниця між відфільтрованим зображенням та оригіналом

im2bw – переводить зображення в двiйковий образ, що заснований на порозi

BW = im2bw(I, level)

BW = im2bw(X, map, level)

BW = im2bw(RGB, level)

Завантажимо зображення з деревами.

BW = im2bw(X,map,0.4);
imshow(X,map), figure, imshow(BW)

Рис. 14 – Зображення в двійковому образі, що засноване на порозі

rgb2gray – переводить зображення в RGB або в палiтру вiдтiнкiв сiрого

I = rgb2gray(RGB)

newmap = rgb2gray(map)

Перетворио RGB зображення в зображення з вiдтiнками сiрого

I = imread(‘board.tif’);
J = rgb2gray(I);
figure, imshow(I), figure, imshow(J);

Рис. 17 – Перетворене RGB зображення в зображення з відтінками сірого


im2bw –  переводить зображення в двійковий образ, що заснований на порозі

BW = im2bw(I,level)

BW = im2bw(X,map,level)

BW = im2bw(RGB,level)

Завантажимо дерева.