Потребител Парола | Регистрация | Забравена парола
Меню
· Начало
· Файлове
· Форум
· Връзки
· Категории на уроците
· За контакти
· Фото галерия
· Търсене
Кажи на приятел

Вашия email:
email на приятел:
Копие за вас?
Реклама

Преоразмеряване картинка във Flash

FlashТези от вас, които са преоразмерявали заредени картинки или обобщено казано — преоразмерявали някаква растерна графика в MovieClip знаят, че качеството се влошава, пикселизира се, и независимо от точността на кода нещата не се подобряват.

На помощ идва един външен за ActionScript 2.0 клас, с който ще направим "гладко" изображение. Този клас се нарича BitmapData, а конструкцията е следната:

var bmp:BitmapData = new BitmapData(width:Number, height:Number [, transparent:Boolean, fillColor:Number]);

1. Като за начало ще трябва да "извикаме" клас BitmapData тъй като той е външен, а по-късно ще ни трябва:

import flash.display.BitmapData;

След като направим това вече ще имаме достъп до този клас, както и до методите му, който ще са необходими.

2. Ще направим два празни MovieClip-a, както и един клип, който ще представлява основния Timeline. Доста удобна техника за адресиране на "основата":

var home:MovieClip = this;
var holder:MovieClip = home.createEmptyMovieClip("holder", 1);
var holder2:MovieClip = home.createEmptyMovieClip("holder2", 2);
holder2.loadMovie("picture.jpg");

home е основния Timeline, а holder1 и holder2 са двата контейнера, в които ще преоразмеряване. Единият ще бъде с обикновено преоразмеряване, затова можем веднага да заредим в него картинката (последния ред горе).

Картинката която зареждам ("picture.jpg") е голям правоъгълник, страните му са значително по-големи от 500 px, а аз ще го преоразмеря, така че по-голямата страна да е 500 пискела, а по-малката — според съотношението им.

3. Вече имаме зареждане, но дори и да тествате анимацията локално може да даде бъгове, затова обичам да правя периодични проверки:

home.onEnterFrame = function(){
if(holder2._width != 0){
delete this.onEnterFrame;

Няма да се впускам в подробни обяснения. Просто казано: когато картинката се зареди в празния MovieClip дължината му ще е по-голяма от 0. Когато това стане ще започне с действията.

var bmp:BitmapData = new BitmapData(holder2._width, holder2._height);
bmp.draw(holder2);
holder.attachBitmap(bmp,1,"auto",true);

Както и сами виждате декларираме наша си променлива, представляваща инстанция на клас BitmapData. Тъй като оперирането с нея е доста трудно (визирам прикачването и взимането на растерна графика) се налага да да използваме контейнера holder2, а и ще видите разликите много лесно. За сега ще продължим с тази конструкция на кода, но може да се експериментира в оптимизиране.

Метода draw е значително семпъл. Прикачваме към bmp съдържанието на holder2, където заредихме картинката, т.е. вече можем да се възползваме от attachBitmap.

Конструкцията на attachBitmap:

attachBitmap(bmp:flash.display.BitmapData, depth:Number [, pixelSnapping:String, smoothing:Boolean]);

Обърнете внимание на последния параметър smoothing — булева променлива, при стойност true ще предотврати пикселизирането.

4. Основната работа е свършена, затова просто ще ви покажа скрипта който използвах за преоразмеряване до 500px:

var newWidth:Number = 500;
var newHeight:Number = 500;
var $width:Number = holder._width;
var $height:Number = holder._height;
if($width > newWidth || $height > newHeight){
if($width >= $height){
var r:Number = $width / $height;
newHeight = newWidth / r;
}else{
var r:Number = $height / $width;
newWidth = newHeight / r;
}
holder._width = holder2._width = newWidth;
holder._height = holder2._height = newHeight;
holder2._x = holder._width;

Проверяваме дали една от страните е по-голяма от 500 пиксела, проверяваме коя е по-голяма и изчисляваме съотношението, на базата на което оразмеряваме по-малката страна.

5. Ще добавим и две текстови полета:

var frm:TextFormat = new TextFormat();
frm.align = "center";
frm.font = "Verdana";
frm.size = 10;
var text1:TextField = home.createTextField("text1",3,holder._x,holder._height,holder._width,17);
var text2:TextField = home.createTextField("text2",4,holder2._x,holder._height,holder._width,17);
text1.text = "Using BitmapData class";
text2.text = "Usual resizing";
text1.setTextFormat(frm);
text2.setTextFormat(frm);
}
}
}

И това е всичко.
· smilev на January 17 2011 14:07:25 · 0 Коментари · 1669 Прочитания · Отпечатай
Коментари
Няма добавени коментари.
Напиши коментар
Моля влезте, за да коментирате.
Оценка
Рейтингите са достъпни само за регистрирани.

Моля влезте или се регистрирайте за да гласувате.

Няма оценки.
Вход
Потребител

Парола



Не сте регистрирани?
Натиснете тук за регистрация.

Забравена парола?
Натиснете тук за нова.
Анкета
С каква операционна система работите











Трябва да влезете за да гласувате.
ЧАТ
Трябва да влезате за да пуснете съобщение.

Няма съобщения.
Статистика