А.А. Чертов, В.А. Лавров
МЕТОДЫ И АЛГОРИТМЫ ДЛЯ ОПТИМИЗАЦИИ ВИДЕОРОЛИКОВ
ФОРМАТА РЕЯ ПО РАЗМЕРУ
В статье дается общее представление о принципах хранения данных в формате БВЯ. Приводится ряд методов для уменьшения размеров хранящихся растровых изображений. Обосновывается, почему в данном формате избыточные данные часто содержатся в растрах именно одинаковой ширины. Приводится алгоритм, позволяющий найти максимальную по высоте область, общую для двух растров одинаковой ширины.
Формат FBR [1] является смешанным, векторнорастровым форматом. С одной стороны, в нём большинство отрисовываемых примитивов являются векторными объектами, а с другой, изображение рассматривается как растр, и координаты привязаны к пикселям на экране. В качестве отрисовываемых объектов в формате используются отрезки, прямоугольники, точки, растры и др. Сам ролик представляет собой последовательность команд-событий, которые заставляют проигрыватель произвести какое-то действие по отрисовке на экран (например нарисовать прямоугольник) или выполнить другую операцию (получить от пользователя подтверждение, что он готов продолжить просмотр видеоролика). Основную часть объема файла с расширением FBR составляют многочисленные растровые изображения, с которыми ассоциируются события соответствующего типа. Одной из главных задач является минимизация суммарного объёма таких данных.
ФОРМАТ ВИДЕОРОЛИКОВ FBR
В формате FBR все растры упакованы при помощи RLE-схемы пиксельного уровня (RLE - аббревиатура от «Run Length Encoding»). Изображение представляет собой последовательность четвёрок чисел (R, G, B, L), где (R,G,B) - цветовые компоненты, а L - счетчик повторений. При распаковке одна такая четвёрка заменяется L пикселями указанного цвета. Данный метод сжатия даёт хорошие результаты на изображениях, в которых много одноцветных областей. Чаще всего изображения, из которых строится пользовательский интерфейс Windows-приложения, подпадают под эту категорию. Тем не менее, добавление в формат альтернативных алгоритмов сжатия может существенно уменьшить размер потока двоичных данных.
НОВЫЕ МЕТОДЫ ДЛЯ УПАКОВКИ РАСТРОВЫХ ОБЪЕКТОВ
Нами были добавлены два дополнительных алгоритма упаковки растров в формате FBR. В каждом из них используется палитра. Рассмотрим эти алгоритмы, исходя из предположения, что сжимаемый растр имеет ширину w и высоту h, а количество цветов в палитре - C. Допустим, что такое изображение может быть сжато алгоритмом RLE до размера S0 (в битах). Первый алгоритм состоит в замене каждого пикселя номером позиции в палитре, где хранится нужный цвет. В этом представлении размер изображения составит 24+24*C+w*h*K бит, где K - количество бит, необходимое для представления числа от 0 до C - 1. В этой формуле первый член - размер палитры, второй - сама палитра, третий - битовая карта. Второй алгоритм является комбинацией первого и последующего RLE-сжатия. В нём сначала задаётся палитра, а затем записывается битовая карта в виде последовательности пар (I,L), где I - индекс цвета в палитре, L - счет-
чик повторений. Для представления I отводится 1 или 2 байта в зависимости от значения C. Счетчик повторений занимает один байт. В результате размер сжатого растра составит 24+24*C+k*S0 бит, где к = 1/2 при C < 28 и к = 3/4 при 28 < C < 216. При C > 216 данный метод неэффективен.
Описанные выше алгоритмы сжатия отдельных растров дают хороший выигрыш в смысле размера результирующего ролика. Кроме упаковки изображений по отдельности, поток двоичных данных можно сократить за счет удаления повторяющихся фрагментов изображений. Эффективность данного подхода определяется технологией записи видеороликов.
СПОСОБЫ ЗАПИСИ В ФОРМАТ FBR
Существуют два способа записи роликов формата FBR. Первый метод основан на перехвате команд GDI (Graphics Device Interface - интерфейс графических устройств) при помощи специального драйвера (технология mirror-driver) и сохранение их в виде последовательности событий. Второй способ (Compatibility Mode - режим совместимости) обеспечивает запись без специального драйвера: через определенный промежуток времени происходит захват содержимого экрана, и при этом регистрируются все произошедшие изменения. Первый способ эффективнее второго в смысле уменьшения нагрузки на центральный процессор (так как не анализируется весь экран) и уменьшения размера результирующего ролика. Например, пользователь перетащил бегунок прокрутки в Internet Explorer. В режиме драйвера изменения будут представлены следующим образом: основная часть содержимого окна переместится вверх или вниз и будет дорисована небольшая порция новых данных. В режиме совместимости обнаружится лишь то, что содержимое окна изменилось, и будет создан новый растр значительного размера. Причем большая часть этого растра уже была отрисована ранее. Таким образом, возникает нежелательное дублирование данных.
АЛГОРИТМ ПОИСКА ОДИНАКОВЫХ ПОДЧАСТЕЙ РАСТРОВЫХ ИЗОБРАЖЕНИЙ
В процессе поиска методов сжатия демонстрационных роликов формата FBR возникла необходимость находить общие части растровых изображений для удаления избыточной информации, записанной в режиме совместимости. Описания оптимальных алгоритмов поиска строго одинаковых частей растров найдены не были. В общей постановке решить эту задачу за приемлемое время не удалось, поскольку не был найден алгоритм, работающий быстрее, чем 0(^3*log^). С другой стороны, задача может быть
достаточно эффективно решена, если её сформулировать по-другому.
Даны два растра одинаковой ширины w. Пусть высота первого растра ^, второго - h2. Необходимо найти такие координаты уь у2 и высоту a, что блок (0, w-l)x(yь Уl+a) в первом растре совпадает с блоком (0, w-1)x(y2,y2+a) во втором растре, причем величина a максимальна (рис. 1 и 2).
Уменьшение избыточности, вызванной прокруткой окон, может быть основано на многократном решении поставленной задачи для различных пар растров равной ширины. Псевдокод решения приведен на рис. 3.
Строка 1. В данном алгоритме растры рассматриваются как последовательности строк, состоящих из пикселей (отсюда тип Р1хе181п^[] у mg1 и mg2). Координаты уь у2 и высота a - выходные параметры, через которые будет передан результат поиска.
Строка 2. Для дальнейших действий необходимо объединить два массива в один. При этом для каждой строки необходимо предусмотреть метки, по которым
можно будет позже восстановить номер растра и у-координату данной строки.
Строки 3 - 5. При помощи алгоритма цифровой сортировки [2, 3] строки лексикографически упорядочиваются. После этого за один линейный просмотр мы делим массив аІІ_Ітеі' на группы одинаковых строк и для каждой строки сохраняем номер группы (в массиве G1 или G2 в соответствии с номером растра, которому данная строка принадлежит). Таким образом, две строки с у-координатами і и і будут равны тогда и только тогда, когда G1[i] = G2[/'] (можно также установить между собой равенство двух строк одного растра, но в данном случае это бесполезно).
Строки 6 - 13. В этой части программы формируется результат. В растрах находится пара равных строк. Если предшествующие им строки не равны между собой или находятся за границей растра (хотя бы одна из них), то найденная пара строк потенциально может быть началом длиннейшей общей подпоследовательности. В этом случае мы пытаемся улучшить текущее значение а (строки 10 - 12).
у2+д
ощЯПпц w млтЧ
Рис. 1. Исходное изображение окна imgl до вертикальной прокрутки
T«kk. Спартак
г
П-Й 'Y3.
L&«а 1, итрм ньт ■
ГіІ/kR.. ТЦиГ-
с>£ьд:
"D: ДІВ, 1? Д.
Л-іі-р:
£шц&] ■SDTJfOl
Й-ЛІЗ i.O)
Ar'Ji* > :"pDf?*i0n
Рис. 2. Изображение окна img2 после его прокрутки вверх
1. void Поиск(PixelString imtjl[], PixelString ітд2[], int hi, int p2, int w, int * a, int * yl, int * y2)
2. PixelStEing all_lines = КонкатенацияМассивов(imgl, img2)
3. ЦифроваяСортировкаСтрок(а11_11пеэ) ;
4. int 01[hi], G2[h2];
5. Опр еделитьНо мер Гр уппы (all_ lines , Gl, G2);
6. *a=0;
7. for (int i=0; i<hl; i++)
8. for (все j, для которых Gl [i]=G2[i ])
9. if ( (i—0 II □ — 0] II (Gl[i-1] != G2[j-1 ] ) ) {
10. int L=1, ci = i+1, cj = j+1;
11. while (ci<hl м cj<h2 м Gl[ci]==G2[cj])
{L++ ; ci++ ; cj++}
12. if ((*a)<L) { *a=L; *yl=i ; *y2=j ; }
13. }
14. return;
15. >
Рис. 3. Псевдокод алгоритма решения задачи поиска одинаковых частей больших изображений
Итак, описанный выше алгоритм состоит из двух этапов: цифровой сортировки массива строк и поиска максимальной общей подпоследовательности в массивах скаляров 01 и 02. Трудоемкость выражается как сумма соответствующих трудоёмкостей и в худшем случае принимает вид: 0(мг*(И1+И2)+И1*И2). В большинстве случаев трудоёмкость второго этапа будет меньше, чем к1*к2, так как совпадающих строк обычно не слишком много.
Главным достоинством этого алгоритма можно считать то, что он гарантированно найдет максимальную по высоте общую область двух растров. К недостаткам стоит отнести достаточно медленную работу цифровой сортировки.
РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ ПРОГРАММЫ-ОПТИМИЗАТОРА НА ОСНОВЕ ПРЕДЛОЖЕННЫХ МЕТОДОВ
Предложенные алгоритмы реализованы в программе, оптимизирующей видеоролики формата БВЯ. Было проведено тестирование на наборе из пяти видеороликов.
Работа с программой mIRC. Продолжительность ролика около двух минут. Изображена работа канала одного из каналов.
Internet Explorer: просмотр страницы http://compu terra.tomsk.ru, часто прокручивалось окно.
Несложное рисование при помощи инструмента «кисть» в редакторе Paint.
Навигация по файловой системе при помощи программы Far Manager. Открываются текстовые файлы, их содержимое прокручивается.
Просмотр четырёх фотографий в программе ACD-See. Стоит отметить, что фотографии не поддаются сжатию без потерь. Уменьшение размера ролика в данном случае возможно только за счет применения палитры и RLE-сжатия.
Сначала пять роликов записывались в режиме совместимости, а потом аналогичные им записывались в режиме mirror-драйвера. Параллельно тестировались две версии программы: старая, в которой не реализован поиск общих частей, и полнофункциональная. Результаты тестирования роликов, записанных в режиме совместимости и mirror-драйвера, приводятся соответственно в табл. 1 и 2.
Таблица 1
Результаты тестирования программы-оптимизатора на роликах, записанных в режиме совместимости
№ теста Исходный размер (байт) Сжатие отдельных растров (байт) Сжатие с поиском общих частей изображений (байт)
1 489,114 367,832 (75%) 167,365 (34%)
2 5,923,808 4,145,970 (70%) 1,303,039 (22%)
3 166,505 144,940 (88%) 141,131 (85%)
4 366,921 242,226 (66%) 209,551 (57%)
5 3,457,541 3,624,016 (105%) 3,628,912 (105%)
Таблица 2
Результаты тестирования программы-оптимизатора на роликах, записанных в режиме ш1ггог-драйвера
№ теста Исходный размер (байт) Сжатие отдельных растров (байт) Сжатие с поиском общих частей изображений (байт)
1 336,378 130,429 (39%) 128,797 (38%)
2 3,903,765 2,955,387 (76%) 2,826,384 (72%)
3 430,355 286,185 (67%) 279,527 (65%)
4 503,903 220,260 (44%) 225,230 (45%)
5 2,209,904 2,170,421 (98%) 2,166,482 (98%)
ЛИТЕРАТУРА
1. Лавров В.А. Векторно-растровый формат хранения видеоизображений // Обработка данных и управление в сложных системах. Томск: Изд-во Том. ун-та, 2004. Вып. 6. С. 106 - 117.
2. Кнут Д. Искусство программирования: В 3 т. М.: Издательский дом «Видьямс», 2000. Т. 2. С. 192 - 197.
3. Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. М.: МЦНМО, 2000. С. 173 - 175.
Статья представлена кафедрой теоретических основ информатики факультета информатики Томского государственного университета, поступила в научную редакцию «Информатика» 24 мая 2005 г.