mega.genn.org

Глянцевые черты фотографий во флеше

Mini watermark

Неаккуратно сделанный флеш-ролик всегда можно узнать по присущим только флешу «водяным знакам качества»: возможности выделить мышкой текст на кнопках и отчаянному пикселению невекторных объектов. Порой, конечно, приходится ухудшать качество, чтобы не сильно грузить процессор, но это не то, о чем я говорю. Речь о свойстве Allow smoothing у находящихся в Library растровых изображений. Что же делать, когда эти изображения не в библиотеке символов?

Allow smoothing

С включенным свойством «Allow smoothing» (пункт «Properties…» контекстного меню растрового объекта в библиотеке) фотографии всегда будут выглядеть дружелюбно (одно из значений слова «smooth»)

Неожиданные преграды и их нетрадиционное преодоление

В субботу утром я решил помочь американским товарищам с сайтом, на котором представлены красивые фотографии красивых машинок. Специфика представления фотографий подразумевала изменение их размера в зависимости от размера окна броузера. Ничего особенного, если не считать, что вплоть до восьмой версии флеша Macromedia, а нычне Adobe, их авторы так и не удосужились дать возможность allow smoothing для динамически подгружаемых растровых изображений.


Достаточно навести курсор на изображение Mini, чтобы увидеть, как плохо выглядят растровые изображения с измененными начальными параметрами (угол наклона, размер) без сглаживания во флеше

Update (спасибо, Женя)
Начиная с девятой версии флеша есть свойство movieClip.forceSmoothing. Когда оно равно true, изображение изменяет свой размер со сглаживанием. Дальнейший текст не убираю для истории и флеша младше девятой версии, но проблема решается куда проще: movieClip.forceSmoothing=true.

Несмотря на отсутствие легких путей решения проблемы в Flash 8 и младше, как это часто бывает с флешем, нашелся не самый сложный обходной путь. Подгружаем фотографию, после чего создаем объект BitmapData, куда и переводим загруженное изображение. Оказывается, ничего не стоит включить сглаживание при этой процедуре. После того, как изображение загружено, а сглаживание включено, «отрисовываем» изображение.

  1. import flash.display.*; // подгружаем необходимую для работы с BitmapData библиотеку
  2. _root.createEmptyMovieClip("pic",_root.getNextHighestDepth()); // сюда поместим картинку со сглаживанием
  3. _root.createEmptyMovieClip("tmpic",_root.getNextHighestDepth()); // в этот символ загрузим jpeg
  4. _root.tmpic._visible=false;
  5. // опускаем код прелоадера, файл загружается в _root.tmpic
  6. // дальнейший код выполняется после завершения загрузки изображения
  7. var bitmap:BitmapData = new BitmapData(
  8. _root.tmpic._width,
  9. _root.tmpic._height,
  10. true);
  11. _root.pic.attachBitmap(
  12. bitmap,
  13. _root.pic.getNextHighestDepth(),
  14. "auto",
  15. true); // этот параметр включает сглаживание
  16. bitmap.draw(_root.tmpic); // переносим фотографию на холст ;)

Пример рабочий, проверено на себе. Поскольку я никак не могу заставить себя полностью перебраться на AS3, программный код написан для Action Script 2, да и требования к сайту вынуждали пользоваться именно этой версией. Но настанет тот час, и я чувствую, что очень скоро, когда я буду вынужден портировать этот код, и не только его, на Action Script 3 или даже выше ;)

***

Я уверен, что не открыл революционный способ (поиск по интернету показал, что я не один такой умный). Тем не менее, уверен, что это простое решение наверняка будет полезным, ведь вопросы об этом мне задают с завидной регулярностью.

Из того же поиска по интернету стало известно, что предложенный выше способ не будет работать, если подгружать изображения с других доменов. Вроде бы есть решения и для этой проблемы, но все они, насколько я заметил, сводятся к совету сделать свой прокси и грузить изображения через него. В это же время flickr подружился с флешем, так что писать интерфейсы для работы с фотографиями с этого ресурса уже не составит труда.

Хочется верить, что в ожидаемом и анонсируемом Flash CS4 встроят не только поддержку 3d (да-да, там будет какой-то псевдо-трехмерный инструментарий), но и кучу недостающих мелочей. Таких как, например, dynamic image smoothing, который появился в Flash CS3.

5.10 в 12:20
5.10.08 в 15:36 | valodka:

Я очень сильно не в теме, но чем плохо выделять курсором текст на кнопках?

5.10.08 в 17:30 | Genn:

valodka, можешь считать это моветоном. Дурным тоном это является хотя бы потому, что странно было бы видеть текстовый курсор при наведении на кнопку, вместо обычной стрелочки или руки. А при нажатии на кнопку и убирании курсора за ее пределы выделять заголовок кнопки. Это, как минимум, сбивает с толку, а я уже писал о том, как важно быть самим собой ;)

5.10.08 в 17:45 | valodka:

Я с таким поведением не сталкивался, поэтому вопрос и возник :)

5.10.08 в 17:47 | Genn:

Значит тебе попадались только аккуратные флешки ;)

8.10.08 в 9:41 | UncleSam:

http://rosbest.ru/agregator/comments/2090

Гена, у тебя велосипеда нету?

8.10.08 в 10:03 | Genn:

Нет ;) Я на роликах и коньках обычно, но похож ;)

8.10.08 в 22:08 | fat loss for idiots:

Hmm… it seems that you have a talent in writing, great blog. Add to my feed reader!

17.10.08 в 11:58 | mendizabal:

У вас много каментов, оставленных ботами (например, предыдущий).

Капчи вам не хватает. Для WP их много.

17.10.08 в 12:53 | Genn:

mendizabal, ну, не так уж и много. Все премодерируются и я в день удаляю действительно много всякой фигни. Предыдущий, заменив ссылку на http://spamparampampam.com/, пропустил из-за ника — он меня развеселил.

Каптчи — вредоносная фигня, которая призвана максимально усложнить добавление комментария. Я их не выношу ;) Кстати, комментариев оставленных ботами, а не людьми в меге нет — у меня стоит немного более хитрая проверка, чем каптча, но сводящаяся, в принципе, к тому же. Только посетителям не приходится ничего вводить ;)

3.12.08 в 13:34 | Женя:

forceSmoothing (MovieClip.forceSmoothing property)

из ActionScript Language Reference …

public forceSmoothing : Boolean

A Boolean value that determines whether images that are added through the loadMovie() method and are in the same hierarchy level as the movie clip are smoothed when scaled. Setting forceSmoothing to true decreases rendering performance. The default value is false.

Availability: ActionScript 1.0; Flash Player 9

3.12.08 в 13:54 | Genn:

Женя, Боже, спасибо ;) Радует только то, что не я один не знал об этой штуке. Сегодня вечером опробую и внесу коррективы в пост!

3.12.08 в 13:58 | Женя:

Не за что! сам вчера столкнулся с этой проблемой, не поверил что нет, покопался … и вот) все отлично работает.

3.12.08 в 16:52 | Женя:

а по поводу выделения текта на кнопках почему нельзя сделать во так

my_btn.title.selectable = false;

где title динамическое текстовое поле.

если кнопки формируются не динамически, то у статичного текстового поля с тайтлом кнопки надо снять кнопку selectable.

или я чего то не понимаю, ведь это ж эелементарно?

3.12.08 в 22:11 | Genn:

Женя, конечно элементарно, только почему-то у некоторых разработчиков руки не доходят или мозги не работают. Это уже проблема не флеша ;)

Оставить комментарий

Copyright © 2007 Genn
Сайт работает под управлением WP-турбийона.
iPhone гарнитура Sennheiser HD 485
Почему Эсквайр стал хуже, чем Esquire был лучше