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

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

С включенным свойством «Allow smoothing» (пункт «Properties…» контекстного меню растрового объекта в библиотеке) фотографии всегда будут выглядеть дружелюбно (одно из значений слова «smooth»)
Неожиданные преграды и их нетрадиционное преодоление
В субботу утром я решил помочь американским товарищам с сайтом, на котором представлены красивые фотографии красивых машинок. Специфика представления фотографий подразумевала изменение их размера в зависимости от размера окна броузера. Ничего особенного, если не считать, что вплоть до восьмой версии флеша Macromedia, а нычне Adobe, их авторы так и не удосужились дать возможность allow smoothing для динамически подгружаемых растровых изображений.
Достаточно навести курсор на изображение Mini, чтобы увидеть, как плохо выглядят растровые изображения с измененными начальными параметрами (угол наклона, размер) без сглаживания во флеше
Update (спасибо, Женя)
Начиная с девятой версии флеша есть свойство movieClip.forceSmoothing. Когда оно равно true, изображение изменяет свой размер со сглаживанием. Дальнейший текст не убираю для истории и флеша младше девятой версии, но проблема решается куда проще: movieClip.forceSmoothing=true.
Несмотря на отсутствие легких путей решения проблемы в Flash 8 и младше, как это часто бывает с флешем, нашелся не самый сложный обходной путь. Подгружаем фотографию, после чего создаем объект BitmapData, куда и переводим загруженное изображение. Оказывается, ничего не стоит включить сглаживание при этой процедуре. После того, как изображение загружено, а сглаживание включено, «отрисовываем» изображение.
import flash.display.*; // подгружаем необходимую для работы с BitmapData библиотеку_root.createEmptyMovieClip("pic",_root.getNextHighestDepth()); // сюда поместим картинку со сглаживанием_root.createEmptyMovieClip("tmpic",_root.getNextHighestDepth()); // в этот символ загрузим jpeg_root.tmpic._visible=false;… // опускаем код прелоадера, файл загружается в _root.tmpic… // дальнейший код выполняется после завершения загрузки изображенияvar bitmap:BitmapData = new BitmapData(_root.tmpic._width,_root.tmpic._height,true);_root.pic.attachBitmap(bitmap,_root.pic.getNextHighestDepth(),"auto",true); // этот параметр включает сглаживаниеbitmap.draw(_root.tmpic); // переносим фотографию на холст ;)
Пример рабочий, проверено на себе. Поскольку я никак не могу заставить себя полностью перебраться на AS3, программный код написан для Action Script 2, да и требования к сайту вынуждали пользоваться именно этой версией. Но настанет тот час, и я чувствую, что очень скоро, когда я буду вынужден портировать этот код, и не только его, на Action Script 3 или даже выше ;)
***
Я уверен, что не открыл революционный способ (поиск по интернету показал, что я не один такой умный). Тем не менее, уверен, что это простое решение наверняка будет полезным, ведь вопросы об этом мне задают с завидной регулярностью.
Из того же поиска по интернету стало известно, что предложенный выше способ не будет работать, если подгружать изображения с других доменов. Вроде бы есть решения и для этой проблемы, но все они, насколько я заметил, сводятся к совету сделать свой прокси и грузить изображения через него. В это же время flickr подружился с флешем, так что писать интерфейсы для работы с фотографиями с этого ресурса уже не составит труда.
Хочется верить, что в ожидаемом и анонсируемом Flash CS4 встроят не только поддержку 3d (да-да, там будет какой-то псевдо-трехмерный инструментарий), но и кучу недостающих мелочей. Таких как, например, dynamic image smoothing, который появился в Flash CS3.


