Расмотрел некоторое кол-во статей по LZW для GIF, и GIF вообще, но некоторые вопросы так и остались непонятными. 1) если у нас код размера в изображении предположем равен 4 бита на пиксел, то это значит что нужно коды для строк из таблицы строк начинать с 18. Просто ведь можно несмотря на то сколько приходиться бит/пиксель брать байт (до 256), а коды начинать с 258, или правильно делать как я написал вначале? 2) не понятно как декодер распознаёт код размер которого больше "номинального", т.е. добавленые коды после инициализации, может быть последовательность <45>,<260>,<54>, ведь если взять код 45 ( 8 бит)=45, а потом 260 (9 бит), но если прочитать только байт это тоже будет нормальное 8 битное число, как узнать что нужно читать 9 бит, а потом опять 8 бит? 3) если кто то разбирался с хешированием, это быстрый способ поиска строки в таблице строк, то можна в 2 словах попонятнее, насколько я понял это самый простой и эффективный способ.
1) Да, коды следует начинать с 18. Это позволяет использовать коды размером пять, шесть, семь, восемь бит вместо того чтобы сразу начинать с 9 бит. Более компактный файл. И становится ещё компактнее за счёт уменьшения размера палитры. 2) Декодер всегда читает количество бит, необходимое чтобы закодировать все слова в словаре. Как только количество слов в словаре становится больше очередной степени двойки, декодер начинает выбирать коды размером на один бит больше. И есть только один способ обратно уменьшить размер кодов - явный код очистки словаря.
captain cobalt 1) В выходном потоке следующие коды: <45>,<260>,<54> код <54> должен быть 8 битным или 9 битным (из за того что ему предшествует код <260>)? 2) В описании формата GIF нашёл пункт что поток кодов делиться на блоки по 255 байт кроме последнего, и в предшествии каждого блока стоит байт - счётчик блока (содержит число байт этого блока), не пойму зачем это нужно и так ли это, смотрел файл GIF в HEX, и регулярных чисел FF не увидел? (Здесь я имею вииду не код размера)
1) Битность кода определяется состоянием словаря. Когда в словаре 257..512 слов, используются 9-битные коды. Для кодирования <260> необходимо 9 бит. Поэтому <54> не может кодироваться 8 битами. 2) Да, так оно и есть. В больших файлах легко видеть байты FF с шагом 256 байт.