2015-01-30 1 views
1

У меня есть тривиальный файл RGB, сохраненный как TIFF в Photoshop, 1000 пикселей или около того. Первая строка состоит из 3 пикселей, каждая из которых имеет шестнадцатеричный красный цвет 4B, зеленый цвет B0, 78 синий, а остальная часть строки - белый.LZW Decompress: Почему первый код словаря встречается в полосе 261 TIFF вместо 257, или я неправильно его читаю?

Полоса LZW-закодированы и начальные байты полосы являются:

80 12 D6 07 80 04 16 27 0C В4 А1 Е0 D0 B8 64 36 ... (на самом деле только первый 7 или так байты значимы на мой вопрос)

в 9-битных сегментах это:.

 
100000000 001001011 010110000 001111000 000000000 100000101 100000110 ... 
    (0x100)  (0x4B)  (0xB0)  (0x78)  (0x00) (0x105) (0x106) 

Из того, что я понимаю, 256 (0x100) это код сброса, но почему первый расширенный код после что 261 (0x105) вместо 257? Я ожидал бы, что любая запись словаря указывает на то, что она будет парой 4B/B0 для второго пикселя (что вполне может быть), но как бы алгоритм декомпрессии мог установить 4B/B0 на 261 вместо 257? Может кто-нибудь объяснить, что мне здесь не хватает? Может ли быть что-то в другом месте в файле .tif, который будет указывать на это? Огромное спасибо. ~

+0

Кодер LZW всегда генерирует более длинные строки последних символов. Код 0x105 является следующим логическим кодом, который представляет строку из последних 4 символов. Так вы повторяете первый 4-байтовый пиксель. Более низкий код должен быть частичной строкой (менее 4 байтов) или неполным пикселем. – BitBank

+0

@BitBank - спасибо - теперь имеет смысл. Я должен был проработать это дальше ... – regger

ответ

1

Давайте посмотрим

256 (100h) is Clear 
257 (101h) is EOF 

в вашем случае, то

4Bh B0h is 258 (102h) 
B0h 78h is 259 (103h) 
78h 00h is 260 (104h) 
00h 00h is 261 (105h) 

выглядит хорошо для меня. LZW может фактически кодировать один символ перед тем, что было добавлено в таблицу.

+0

Спасибо ... очевидно, мне нужно смотреть вперед (неопределенно?), Пока этот код не вставлен в словарь. Это не казалось необходимым, когда я проходил через псевдокод, с которым я столкнулся. Это будет работать сейчас. OT - пытается проголосовать, но «нужен уровень репутации 15?» сделать это? Есть ли способ признать это? Еще раз спасибо ... – regger

+0

Я не знал, что вам нужен определенный уровень репутации для голосования, я не помню этого еще раз :) - неважно, вы можете вернуться в другое время и сделать это, если хотите. –

+0

Может быть, кто-то, не проявляющий особого интереса к этой теме, может проголосовать за меня? :) – regger

 Смежные вопросы

  • Нет связанных вопросов^_^