Алгоритм сжатия LZW для GIF. Несколько вопросов.

Тема в разделе "WASM.A&O", создана пользователем Chib777, 14 апр 2006.

  1. Chib777

    Chib777 Александр

    Публикаций:
    0
    Регистрация:
    22 сен 2003
    Сообщения:
    82
    Адрес:
    Ukraine, Odessa
    Расмотрел некоторое кол-во статей по LZW для GIF, и GIF вообще, но некоторые вопросы так и остались непонятными.

    1) если у нас код размера в изображении предположем равен 4 бита на пиксел, то это значит что нужно коды для строк из таблицы строк начинать с 18. Просто ведь можно несмотря на то сколько приходиться бит/пиксель брать байт (до 256), а коды начинать с 258, или правильно делать как я написал вначале?

    2) не понятно как декодер распознаёт код размер которого больше "номинального", т.е. добавленые коды после инициализации, может быть последовательность <45>,<260>,<54>, ведь если взять код 45 ( 8 бит)=45, а потом 260 (9 бит), но если прочитать только байт это тоже будет нормальное 8 битное число, как узнать что нужно читать 9 бит, а потом опять 8 бит?

    3) если кто то разбирался с хешированием, это быстрый способ поиска строки в таблице строк, то можна в 2 словах попонятнее, насколько я понял это самый простой и эффективный способ.
     
  2. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    1) Да, коды следует начинать с 18. Это позволяет использовать коды размером пять, шесть, семь, восемь бит вместо того чтобы сразу начинать с 9 бит. Более компактный файл. И становится ещё компактнее за счёт уменьшения размера палитры.



    2) Декодер всегда читает количество бит, необходимое чтобы закодировать все слова в словаре. Как только количество слов в словаре становится больше очередной степени двойки, декодер начинает выбирать коды размером на один бит больше. И есть только один способ обратно уменьшить размер кодов - явный код очистки словаря.
     
  3. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Chib777

    Используй crc32 для быстрого сравнения строк
     
  4. Chib777

    Chib777 Александр

    Публикаций:
    0
    Регистрация:
    22 сен 2003
    Сообщения:
    82
    Адрес:
    Ukraine, Odessa
    captain cobalt

    1) В выходном потоке следующие коды:

    <45>,<260>,<54>

    код <54> должен быть 8 битным или 9 битным (из за того что ему предшествует код <260>)?

    2) В описании формата GIF нашёл пункт что поток кодов делиться на блоки по 255 байт кроме последнего, и в предшествии каждого блока стоит байт - счётчик блока (содержит число байт этого блока), не пойму зачем это нужно и так ли это, смотрел файл GIF в HEX, и регулярных чисел FF не увидел? (Здесь я имею вииду не код размера)
     
  5. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    1) Битность кода определяется состоянием словаря. Когда в словаре 257..512 слов, используются 9-битные коды. Для кодирования <260> необходимо 9 бит. Поэтому <54> не может кодироваться 8 битами.



    2) Да, так оно и есть. В больших файлах легко видеть байты FF с шагом 256 байт.