
В своих проектах я, очень часто, сталкиваюсь с генерацией файлов разных графических форматов.
Чаще всего это, конечно, обычные jpg файлы.
В этом посте я хочу рассказать вам о разных кодировщиках осуществляющих данную процедуру, сравнить их и выбрать лучший.
Итак, наши номинанты на получение премии лучший Jpeg Encoder:
com.adobe.images.JPGEncoder
Кодер от as3corelib
JPEGEncoder
Оптимизированная байтарейцами кодер от as3corelib
http://www.bytearray.org/?p=775
cmodule.jpegencoder.CLibInit
Alchemy кодер от segfaultlabs
http://segfaultlabs.com/devlogs/alchemy-asynchronous-jpeg-encoding-2
by.blooddy.crypto.image.JPEGEncoder
Кодер от blooddy
http://www.blooddy.by/ru/crypto/
Сразу нужно заметить, что генерация jpeg файлов бывает двух видов – синхронная и асинхронная.
Синхронная кидает всю мощность системы на просчет файла и “вешает” систему до полного окончания генерации.
Асинхронная делает просчет с паузами, тем самым, позволяя выводить на экран данные процесса и совершать пользователю действия.
Соответственно синхронная работает быстрее в несколько раз.
Какую из них выбрать зависит зависит от типа вашей разработки и размера генерируемого файла.
Например для генерации больших файлов в пользовательских приложениях лучше использовать асинхронную, так как пользователь получает не “зависший флэш”, а красивую картинку с процентами процесса генерации файла. Для мелких файлов конечно лучше синхронная, небольшое подвисание компенсируется быстротой генерации.
Чтобы долго не тянуть рассмотрим на практике результаты тестов.
Как видите, “алхмия” уделывает все остальные кодировщики по скорости.
UPDATE: Как оказалось на локале и в браузере кодировщики ведут себя по-разному. Если на локалке “алхимия” в лидерах.
То в браузере кодировщик от bloody уделывает её. Для более точного анализа отпишитесь в коментах о ваших результатах.
Но дело в том, что библиотка от segfaultlabs уделывает все остальные еще и по гибкости настроек.
Если в стандартных кодировщиках у нас просят всего два параметра (bitmapdata и качество сжатия jpg), то “алхимия” может принять и размеры исходного джепега и налету его заресайзить.
А сейчас небольшой туториал по подключению этой прекрасной библиотеки в формате fla + FlashDeveloper.
1. Качаем swc библиотеку отсюда (ссылка внизу поста) http://segfaultlabs.com/devlogs/alchemy-asynchronous-jpeg-encoding-2 и сохраняем её, например, в папочку lib вашего проекта.
2. Создаём новый fla-файл, открываем Publish Settings. Чтобы swc библиоткека не ругалась плохими ошибками ставим галочку Export SWC. В результате при компиляции проекта рядом с swf вы увидите swc файл, который не нужен для последующей работы с swf.

3. Заходим в “ActionScript 3.0 Settings…” и инклудим библиотеку с помощью кнопки Browse.

4. Открываем Flash Developer проект и с помощью правой клавиши мыши добавляем библиотеку в проект.

Теперь немного кода.
Инициируем библиотеку:
import cmodule.jpegencoder.CLibInit;
_jpeginit:CLibInit = new CLibInit();
_jpeglib = _jpeginit.init();
Подключаем кодировщик:
_jpeglib:Object;
_progressMonitor:Number; //монитор прогресса ж)
_jpgArray:ByteArray; //временное хранилище
_jpgStream:ByteArray; //итоговый массив файла
_jpgSource:BitmapData; //исходная битмапа для кодировки
_progressMonitor = setInterval(encodeProgress, 20); //заряжаем мониторинг прогресса
_jpgArray = _jpgSource.getPixels(_jpgSource.rect);
_jpgArray.position = 0;
_jpgStream = new ByteArray();
_jpeglib.encode(_jpgArray, _jpgStream, _jpgSource.width, _jpgSource.height, 60); //синхронная кодировка
//или
_jpeglib.encodeAsync(encodeComplete, _jpgArray, _jpgStream, _jpgSource.width, _jpgSource.height, 60); //асинхронная кодировка
function encodeComplete(ba:ByteArray) {
clearInterval(_progressMonitor); //останавливаем прогресс монитор
}
function encodeProgress() {
trace("Progress - " + Math.round(_jpgArray.position / _jpgArray.length * 100) + "%");
}
Спасибо за внимание, вопросы и каменты приветствуются.




что-то я не увидел что алхимия уделывает остальные, либа от бладди быстрее в два раза алхимии
и кнопки во флешке с неправильными лейблами
Хмм… удивительное дело.
Напиши-ка какие тебе выдаёт цифры.
У меня на локалке:
by.blooddy.crypto.image.JPEGEncoder – 1434
cmodule.aircall.CLibInit sync – 1243
А в браузере:
by.blooddy.crypto.image.JPEGEncoder – 1111
cmodule.aircall.CLibInit sync – 1540
Видимо придется пересмотреть реузультаты ж)
com.adobe.images.JPGEncoder – 5293
bytearray.org JPGEncoder – 1324
by.blooddy.crypto.image.JPEGEncoder – 639
cmodule.aircall.CLibInit sync – 1121
cmodule.aircall.CLibInit async – 3334
лично у меня всё зависит не только от окружения, но и от размера. я пытался повторить логику работы сишной либы, но запутался и забыл =)
BitmapData сгенерирован
bytearray.org JPGEncoder – 3144
by.blooddy.crypto.image.JPEGEncoder – 2321
cmodule.aircall.CLibInit sync – 2117
cmodule.aircall.CLibInit async – 5170
Адобовский енкодер вышел за 15-ти секундный лимит.
Доброго дня! сильно нужна библиотека segfaultlabs, никак подключить не могу в CS4.
Сделал импорт в библиотеки, даже засунул в lib в %AppData, ну никак и все.
1046: Type was not found or was not a compile-time constant: CLibInit.
В мануале написано “Открываем Flash Developer проект и в окне…”, может я не понял чего, Flash Developer проект это собственно сам fla проект , или интерфейс “developer”, вообщем найти это окно с ПКМ “AddToLibrary” не могу. помогите, пжлста!
flash developer это http://www.flashdevelop.org/wikidocs/index.php?title=Main_Page
Если вы пользуетесь стандартным gui флэша, то всё должно работать после подключения библиотеки в настройках паблиша.
да я тоже понимаю что должно, ан нет..