на школьную страницу...

Почему GIF-файлы дожили до наших дней?

С.И.Хашин

GIF - Graphics Interchange Format, разработан фирмой CompuServe в 1987-89 гг. для хранения растровых цветных изображений. Многие другие графические форматы, разработанные в те годы уже давным-давно забыты. Но этот формат активно используется до сих пор. Почему? Ведь в нем даже нельзя хранить полноцветные изображения, а лишь палитровые. Что же в нем привлекательного?

Две его отличительные черты - это:


Рис. 1. белый фон

Рис. 2. прозрачный фон

Сравним результаты сохранения одного и того же изображения в разных форматах. Левая картинка (рис.1) - это файл x_cub.gif размером 2225 байт (файл на рис.2 имеет тот же размер). В формате png картинка будет точно такая же, но размер файла - 1662 байта. Сохраним теперь ту же картинку в jpg-файле с различным уровнем качества (q).


Рис. 3. jpeg, q=100,   21 742 байта.

Рис. 4. jpeg, q=80,   10 718 байтов.

Рис. 5. jpeg, q=60,   8 222 байта.

Рис. 6. jpeg, q=40,   6 635 байтов.

Видно, что jpg-файлы имеют либо слишком большой размер, либо недостаточное качество, при q=40 дефекты бросаются в глаза, хотя при q=80 труднозаметны.

Можно ли сохранять в формате gif фотографию? В принципе можно. Но её для этого придется перевести из полноцветной в палитровую.

Что это значит? В полноцветном изображении, например, в jpeg, цвет каждой точки задается тремя числами - яркостью красного (Red), зеленого (Green) и синего (Blue), все вместе, - три целых числа RGB. Каждое число занимает 1 байт и значит, лежит в пределах от 0 до 255. Все три байта вместе могут принимать 2563 ~= 16 млн. значений. В GIF-файле цвет очередной точки не произвольный, а из заранее заданной палитры, то есть из некоторого заранее заданного набора RGB-цветов. Цветов в палитре не может быть больше 256 (меньше - может).

Таким образом, прежде чем сохранять фотографию в виде gif-файла, надо уменьшить количество цветов. Причем сделать это так, чтобы фотография визуально не слишком изменилась. Для этого надо выбрать не более 256 различных RGB-цветов и каждый из цветов, присутствующих на фотографии надо "округлить" до одного из палитровых.

Посмотрим, каковы результаты сохранения фотографий в gif-файлах.


Рис. 7. jpeg, q=100,   118 502 байта.

Рис. 8. jpeg, q=95,   67 340 байтов.

Рис. 9. gif,   80 052 байта.

Рис. 10. png,   71 875 байтов.

Картинки на рисунках 9 и 10 идентичны, содержат по 256 различных цветов, это палитровые изображения. Для сравнения, те же картинки в jpeg-формате (рис. 7,8) содержат примерно по 50 тыс. различных цветов.

Вы не видите разницы? Она есть, только в глаза не бросается. Посмотрите повнимательнее, например, на фактуру асфальта в нижнем левом углу.

Формат не поддерживает полноцветные изображения (TrueColor), а лишь только палитровые: в начале файла задается некоторая таблица RGB-цветов (не более 256 штук) и цвет каждой точки задается в виде номера в этой таблице. Таким образом, каждая точка кодируется одним-единственным байтом. Таблица цветов может считаться стандартной (или серой) и в этом случае отсутствовать в файле. Несмотря на невозможность хранения полноцветных изображений, качество gif-файла весьма высокое и обычно такое изображение трудно на глаз отличить от полноцветного.

Последовательность байт, описывающих изображение сжимается стандартным LZW-алгоритмом.

Интересной особенностью формата является "прозрачный цвет": один из элементов таблицы цветов объявляется прозрачным. Очень удобный эффект для применения в html-файлах. Другая важная черта - возможность сохранения в одном файле сразу нескольких изображений (анимированный gif) и последовательный вывод на экран одного за другим с заданным интервалом. Эта возможность широко используют в интернете для получения простейшей анимации: при просмотре страницы на экране может все время что-то дергаться и крутиться. К счастью, большинство броузеров позволяют такую возможность отключить.

Общий формат файла

В дескрипторе каждого изображения задается его размер, координаты начальной точки на логическом экране (из дескриптора экрана). Наличие локальной палитры и ее размер (степень двойки). Если локальной палитры нет, используется глобальная. Кроме того может использоваться стандартная палитра и оттенки серого. Может быть определен "прозрачный" цвет в палитре (как глобальной, так и в локальной). Дополнительно можно задать задержку (изменяется в 0.01 сек) после вывода очередного изображения на экран до обработки следующего. Кроме того, имеется поле, описывающее что должно произойти с очередным изображением после истечения времени задержки:

Патентные проблемы

Формат GIF активно использовался до конца 1994 года. Одна из его составных частей - алгоритм сжатия LZW. Он был запатентован в 1985 г., правда никих последствий это не имело.

Но 24 декабря 1994 года неожиданно две конторы, Unisys и CompuServe, которым в результате каких-то махинаций достался патент, совместно провозглашают, что любой разработчик, создающий программу, читающую или пишущую GIF-файлы, должен производить отчисления Unisys за использование алгоритма LZW.

В результате многие продукты прекратили использовать или поддерживать данный формат, а вместо него был разработан формат PNG.

Срок действия патентов заканчивался в 2005 году (точнее говоря, в разных странах немного по-разному). За две недели до окончания срока патента правообладатели устроили аттракцион "невиданная щедрость". Учитывая свою миссию в борьбе против тирании, помня о борьбе с голодом и об стонущих под игом, правообладатели безвозмезно, то есть даром отдают свое сокровище во всенародное пользование.

И теперь мы можем пользоваться этим методом сжатия совершенно свободно.

Flag Counter