vs кодировщики JPEG-файлов.

В своих проектах я, очень часто, сталкиваюсь с генерацией файлов разных графических форматов.
Чаще всего это, конечно, обычные 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 файлов бывает двух видов – синхронная и асинхронная.
Синхронная кидает всю мощность системы на просчет файла и “вешает” систему до полного окончания генерации.
Асинхронная делает просчет с паузами, тем самым, позволяя выводить на экран данные процесса и совершать пользователю действия.
Соответственно синхронная работает быстрее в несколько раз.
Какую из них выбрать зависит зависит от типа вашей разработки и размера генерируемого файла.

Например для генерации больших файлов в пользовательских приложениях лучше использовать асинхронную, так как пользователь получает не “зависший флэш”, а красивую картинку с процентами процесса генерации файла. Для мелких файлов конечно лучше синхронная, небольшое подвисание компенсируется быстротой генерации.

Чтобы долго не тянуть рассмотрим на практике результаты тестов.

Get Adobe Flash player

Как видите, “алхмия” уделывает все остальные кодировщики по скорости.

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) + "%");
}

Спасибо за внимание, вопросы и каменты приветствуются.

Tags: , , ,

8 comments

  1. что-то я не увидел что алхимия уделывает остальные, либа от бладди быстрее в два раза алхимии
    и кнопки во флешке с неправильными лейблами

    • Хмм… удивительное дело.
      Напиши-ка какие тебе выдаёт цифры.

      У меня на локалке:
      by.blooddy.crypto.image.JPEGEncoder – 1434
      cmodule.aircall.CLibInit sync – 1243

      А в браузере:
      by.blooddy.crypto.image.JPEGEncoder – 1111
      cmodule.aircall.CLibInit sync – 1540

      Видимо придется пересмотреть реузультаты ж)

  2. BitmapData сгенерирован
    bytearray.org JPGEncoder – 3144
    by.blooddy.crypto.image.JPEGEncoder – 2321
    cmodule.aircall.CLibInit sync – 2117
    cmodule.aircall.CLibInit async – 5170
    Адобовский енкодер вышел за 15-ти секундный лимит.

  3. Доброго дня! сильно нужна библиотека segfaultlabs, никак подключить не могу в CS4.
    Сделал импорт в библиотеки, даже засунул в lib в %AppData, ну никак и все.
    1046: Type was not found or was not a compile-time constant: CLibInit.
    В мануале написано “Открываем Flash Developer проект и в окне…”, может я не понял чего, Flash Developer проект это собственно сам fla проект , или интерфейс “developer”, вообщем найти это окно с ПКМ “AddToLibrary” не могу. помогите, пжлста!

Leave a comment

You must be logged in to post a comment.