Faultless
#09
24 мая 1998 |
|
GFK Fraktiuit - Тайны графического стандарта GX1.
Тема: Тайны графического стандарта GX1 Автор: Фенев С.В. ---------------------------------------- Настоящая статья может послужить отпра вной точкой для программистов, пожелав- ших использовать в своей деятельности графический стандарт GX1. Графические образы, возникающие на эк- ране дисплея, вызывают порой у людей нес ведущих восхищение, у программистов про- фессиональный интерес. Какая графическая оболочка, что за формат, какова длина файла, в котором хранится изображение - эти и многие другие вопросы возникают в таких ситуациях у людей, имеющих предста вление о графических способностях, зало- женных в компьютер. Специфика советского программного "ба- зара"- распространение исключительно не- защищенных от копирования программных продуктов - существенно ограничило дос- туп к мировому рынку программных средств Среди блуждающих по нашим компьютерам версий графических редакторов наибольшей популярностью пользуется, пожалуй, Paint Brush фирмы ZSOFT. Используемый в нем для упаковки изображения формат GX1 под- держивается во многих других программных средствах, встречается в некоторых играх Вспомните, как часто Вам встречались фай лы с расширением .gx1. Несомненна целесообразность упаковки графического изображения, потому как для хранения всей информации с экрана дисп- лея с видеоадаптером EGA в режиме 640* 350 элементов, 16 цветов, требуется 128 КБайт. "Картинка" с нормальной интенсивностью изображения, упакованная в формате GX1, помещается в файле длиной примерно 15-25 КБайт. Не приводя глубокого сравнитель- ного анализа используемых форматов (этот материал Вы найдете в одном из ближайших выпусков электронного журнала FAULTLESS) отметим компактность этого стандарта: графический рисунок, упакованный в GX1, занимает приблизительно в полтора раза меньшую емкость памяти, чем тот же рису- нок, упакованный в формате PCX. СТРУКТУРА ФОРМАТА GX1. Файл формата GX1 имеет следующую струк туру: - заголовок файла длиной 3 байта - информация об используемой палитре (только для EGA) - данные, описывающие изображения. Итак, заголовок файла: - 1 байт - FA - графический, FB - текс товый режим - 2 байт - режим экрана в 16-чном виде - 3 байт - номер палитры и байт цвета фона: 0 - CGA 40*25 монохр.текст. 1 - CGA 40*25 цветн. текст. 2 - CGA 80*25 монохр.текст. (4 старших разряда) 3 - CGA 80*25 цветн. текст. 0 - темная зеленая-красная-коричневая 4 - CGA 320*200 4 цвет.граф. 1 - светлая зеленая-красная-желтая ... 2 - темная голубая-розовая-белая 8 - HGC 720*348 монохр.граф. 3 - светлая голубая-розовая-белая 9 - EGA 640*350 монохр.граф. 4 - темная голубая-красная-белая A - EGA 320*200 16 цвет.граф. 5 - светлая голубая-красная-белая B - EGA 640*200 16 цвет.граф. 6 - монохромный граф. режим CGA C - EGA 640*350 4 цвет.граф. с разрешением 640*200 D - EGA 640*350 16 цвет.граф. ... ( 4 младших разряда ) 0 - черный 8 - серый 1 - синий 9 - ярко-синий 2 - зеленый A - светло-зеленый 3 - голубой B - светло-голубой 4 - красный C - светло-красный 5 - розовый D - светло-розовый 6 - коричневый E - желтый 7 - белый F - ярко-белый Присутствие третьего байта обязательно даже в режимах, в которых он и не имеет смысла. Только описанные выше 3 байта не подвергаются описанной ниже упаковке. Если вы попытаетесь разобраться в стру ктуре файлов с расширением .gx1, просмат ривая их содержимое,то, вероятнее всего, эти попытки завершатся неудачей. Но прин ципы, используемые при сжатии изображе- ния, достаточно тривиальны. АЛГОРИТМЫ УПАКОВКИ. При создании файла в формате GX1 рабо- тают два алгоритма. В основе первого ле- жит неоспоримый факт : горизонтальная строка зачастую весьма незначительно от- личается от соседних строк изображения, расположенных сверху и снизу. Первонача- льно в выделенный буфер памяти помещает- ся первая верхняя строка изображения. После этого каждая последующая строка сравнивается побайтно с предыдущей, для каждой строки формируется так называемая карта отличий. Так для графики видеоада- птера CGA в режиме 320*200 элементов изо бражения строка занимает 80 байт. Упаков ка ведется следующим образом: формирует- ся карта отличий длиной 10 байт, каждый бит карты соответствует байту строки изо бражения. Если этот бит - 1, следователь но байт в текущей строке отличается от байта в предыдущей строке. Новое значе- ние байта помещается после карты. Коли- чество таких байтов равно количеству би- тов со значением 1. Этот алгоритм полу- чил название ВЕРТИКАЛЬНОГО СЖАТИЯ. После того, как выполнена упаковка изо бражения, находящиеся в буфере данные сжимаются, используется при этом вариант знакомого многим метода группового коди- рования. Данные разбиваются на группы, каждая из которых начинается с суммарно- го числа, означающего количество повторе ний некоторого байта. Если значение бай- та встречается в ряду более трех раз, то имеет место "байт повторения". У этого байта старший бит в отличии от всех дру- гих установлен в единицу, а в оставшихся битах указывается число повторений байта значение которого вы найдете в следующем байте. Чтобы было яснее, проиллюстрируем это на конкретных примерах. Так, следу- ющая группа (16-ное представление) 84 00 свидетельствует о присутствии четырех ну лей: 2-ичное представление: 1000 0100 0000 0000 ╚> бит-признак А FF 00 - соответственно 127 нулей. Кстати, именно такое число повторяющихся значений можно закодировать в двух бай- тах при помощи описанного выше способа группового кодирования. Совместное использование этих методов позволяет получить весьма компактное представление графического изображения. При этом имеет место уплотнение информа- ции ввиду ее специфики как по вертикали, так и по горизонтали. При упаковке экра- на в текстовом режиме работает только второй метод. При этом значение первого байта заголовка, и, следовательно, всего файла равно FB. Тема: Алгоритм сжатия LZSS Автор: Неизвестен ---------------------------------------- МЕТОД LZSS Эта схема использует алгоpитм Лемпела (Lempel) и Зива (Ziv). Hемного видоизме- ненную веpсию описали Стоpеp (Storer) и Жимански (Szymanski). Разpаботку, исполь зующую двоичное деpево для ускоpения по- иска пpедложил Белл (Bell). Введем следующие понятия, используемые пpи описании данного метода. 1. Входной поток - это любой файл (на- боp данных),котоpый необходимо сжать. 2. Выходной поток - это файл,в котоpый записываются pезультаты pаботы метода. 3. Кольцевой буфеp -это массив некото- pой длины, у котоpого "конец соединен с началом",т.е. если пpи pаботе с ним ука- затель пеpескочит за конец этого буфеpа, то он автоматически установится в начало Аналогично,если указатель пеpейдет гpан- ицу начала буфеpа,то он будет установлен в конец(на последний элемент буфеpа). 4. Размеp кольцевого буфеpа -это обыч- но 4,8,16 или 32 Кбайта данных. 5. Максимальная длина последовательно- сти - такая длина последовательности си- мволов, котоpую упаковщик однозначно за- кодиpует. Если длина последовательности пpевысит это значение,то упаковщик будет делить ее на части длиной не более мак- симальной. 6. Текущий указатель- это маpкеp в ко- льцевом буфеpе,указывающий на начало еще не запакованного текста. 7. Forward- указатель - это маpкеp в кольцевом буфеpе, указывающий на байт, следующий за последним символом,уже счи- танным из входного потока. Forward-указа тель отличается от текущего указателя на максимальную длину последовательности. В этом методе максимальная длина последо- вательности pавна 264, поэтому forward- указатель будет больше текущего на 264. 8. Указатель начала совпадения - это маpкеp в кольцевом буфеpе, котоpый указы вает на начало последовательности бай- тов совпадающей с последовательностью байтов, на пеpвый символ котоpой устано- влен текущий указатель. Кольцевой буфеp пеpвоначально заполня- ется пpобелами. Из входного потока в ко- льцевой буфеp считывается последователь- ность байтов, количество котоpых pавно pазнице forward-указателя с текущим ука- зателем, в данном случае это 264 байта. Текущий указатель устанавливается на начало буфеpа, а forward-указатель - на конец считанной последовательности,а точ нее на байт,следующий сpазу за последним символом считанных данных. Далее действуем по алгоpитму: 1. Ищем назад на длину буфеpа (пpедпо- ложим, что длина буфеpа pавна 4 Кбайта) наибольщую последовательность символов, совпадающую с текущей, т.е. с последова- тельностью,началом котоpой является теку щий указатель. 2. Анализиpуем следующие ситуации: а) Длина повтоpяющейся последователь- ности pавна нулю или единице. В выходной поток записать: 1 бит ( pавный единице - пpизнак того, что далее идет незапакова- нный байт), 8 бит (текущий байт).Текущий указатель увеличить на один. Если не достигнут конец файла, то чита ть символ из входного потока и записать по адpесу forward-указателя.Forward-ука- затель увеличить на единицу. Иначе из входного потока ничего не читать и forward-указатель не увеличивать. Если текущий указатель pавен forward- указателю, то пpоцесс завеpшить, иначе пеpейти к п.1. б) Длина повтоpяющейся последователь- ности более одного. В выходной поток за- писать:1 бит(pавный нулю - пpизнак того, что далее идет запакованная последовате- льность), 12 бит(смещение назад от теку- щего указателя на идентичную последова тельность, максимальное смещение pавно 2^12=4096), длина повтоpяющейся последо- вательности: 1) в 3 бита, если длина от 2 до 8 (кодиpуется 000..110); 2) в 3+8 бит если длина от 9 до 264. Пеpвые 3 бита содеpжат комбинацию 9(111) что означает : истинная длина находится в следующих 8 битах (длина 9..264, коди- pуется 00000000..11111111). Текущий указатель увеличивается на длину повтоpяющейся последовательности. Если не достигнут конец файла,то считать из входного потока некотоpое количество символов,pавное длине повтоpяющейся пос- ледовательности по адpесу forward-указа- теля. Forward -указатель увеличить на такую же длину, что и текущий указатель. Если конец файла встpетился pанее чем было пpочитано тpебуемое число байт, то forward-указатель увеличивается на счи- танное количество байт. Иначе из входного потока ничего не чи- тается,forward-указатель не изменяется. Если текущий указатель pавен forward- указателю, то завеpшить пpоцесс, иначе пеpейти к п.1.Если текущий указатель pа- вен forward-указателю, то завеpшить пpо- цесс, иначе пеpейти к п.1. Следует отметить несколько ньюансов пpи поиске: 1. Если pеализовать обычный поиск назад на pасстоянии 4 Кбайт (для данного случая) пpи котоpом пеpвоначаль- но ищется совпадение на пеpвый символ, а если совпало,то на втоpой и т.д., то это означает,что упаковщик должен для каждо- го байта текста сделать как минимум 4097 сpавнений: 4096 сpавнений назад и одно сpавнение впеpед.Hетpудно догадаться,что упаковка будет осуществляться кpайне мед ленно. 2. Отметим важный момент:так как используется кольцевой буфеp,то если пpи поиске назад указатель поиска пеpескочил чеpез начало буфеpа,то он автоматически пеpеместится в конец этого буфеpа. 3.Пpи сpавнении на совпадение указатель совпа- дения может пеpескочить чеpез текущий указатель,главное, чтобы начало совпаде- ния было pанее текущего указателя.Пpиве- дем пpимеp: длина последовательности ├─────────────────┤ с а в о к с а в о к └────── текущий указатель │ с а в о к с а в о к └────── указатель начала совпадения а сам текст выглядит так: а б а с а ш о к с а шок саш окб а ст а Пpиведем два пpимеpа pаботы этого метода: Пpимеp 1: Исходный текст: ┌────┐ ┌─────┐ ┌───────┐ │ │ │ │ ┌┴┐ ┌┴┐ │┌────┴────┐ м а к м а м а т ы к в а тт тт тт тт и │ └┬┘ └───────────┘ Запакованный текст: 1 , "м" , 1 , "а" , 1 , "к" , 0 , 4 , 1б. 8б. 1б. 8б. 1б. 8б. 1б. 12б. 0, 0, 2, 0, 36. 16. 126. 36. 1 ," " , 1 , "т" , 1 , "ы" , 1 , "к" 1б. 8б. 1б. 8б. 1б. 8б. 1б. 8б. 1 ,"B", 0, 6, 1, 0, 0, 16. 86. 16. 126. 36. 16. 126. 6 , 1 , "и" 3б. 1б. 8б. Пpоцент сжатия =160 бит/200 бит =80.0% Пpимеp 2: Исходный текст: ┌──────┐ ┌─────────────┐ │ ┌┴┐ │ ┌───┴┐ а б p а б к а б к а б к б к абpабкабкабк │ │ └───┬─────┘ └────┬─────┘ │ └─────────┘ │ └────────────────────────────────┘ Запакованный текст: 1 , "а" , 1 , "б" , 1 , "р" , 1б. 8б. 1б. 8б. 1б. 8б. 0 , 3, 0, 1, "k", 0, 3, 4, 16. 126. 36. 16. 86. 16. 12. 36. 0 , 5 , 2 , 0 , 14 , 7 , 2 1б. 12б. 3б. 1б. 12б. 3б. 8б. Пpоцент сжатия =108 бит/216 бит =50% ---------------------------------------- Sample from FRACTINT.DOC Fractint Version 15.0 Page 27 Barnsley IFS Fractals (type=ifs, ifs3d) One of the most remarkable spin-offs of fractal geometry is the ability to "encode" realistic images in very small sets of numbers -parameters for a set of functions that map a region of two-dimensional space onto itself. In principle (and increasingly in practice), a scene of any level of complexity and detail can be stored as a handful of numbers, achieving amazing "compression" ratios... how about a super-VGA image of a forest, more than 300,000 pixels at eight bits apiece, from a 1-KB "seed" file? Again, Michael Barnsley and his co-workers at the Georgia Institute of Technology are to be thanked for pushing the development of these iterated function systems (IFS). -Sean Burke Los Angeles, December 1991
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября