Как вы сжимаете данные изображения для кодирования LZW для файлов .GIF? - PullRequest
0 голосов
/ 03 декабря 2018

У меня проблемы с пониманием того, как сжимать данные изображения для спецификации 89a для файлов .gif.Скажем, например, я пытаюсь сделать 3x2 .GIF.Позвольте мне создать пример таблицы цветовых кодов и пройтись по примеру [того, что я считаю правильным].

Color code | Color
------------------
0          | Brown
1          | Red
2          | Green
3          | Black

Изображение, которое я хочу создать, таково:

3x2 pixels (6 pixels total)
----------
Br Br Br
Br R  Br

Сжатиес LZW проведет меня через этот процесс.Это окончательная таблица кодов, которую я получаю.

Code table
----------
# | code
0 | 0
1 | 1
2 | 2
3 | 3
4 | clear
5 | eoi // end of information
6 | 0 0
7 | 0 0 0
8 | 0 1
9 | 1 0

С возможным значением 4 0 6 0 1 0 5, которые являются моими кодами.Поскольку я написал код 0 0 0, это значение кода равно 7, поэтому мне пришлось увеличить размер кода с 3> 4 бит для последующих кодов.Итак, вот байты данных моего изображения (из моей кодовой таблицы).

100  - 4
000  - 0
110  - 6
0000 - 0
0001 - 1
0000 - 0
0101 - 5

Я заканчиваю тем, что кодирую свои данные изображения как

10000100 - 132
00100001 - 33
10100000 - 160
00000000 - 0

, что в итоге выглядит такмой последний файл .gif (я поставил квадратные скобки вокруг значений, соответствующих данным изображения)

47 49 46 38 39 61 03 00 02 00 f1 00 00 b9 7a 56    
ff 00 00 00 ff 00 00 00 00 21 ff 0b 4e 45 54 53 
43 41 50 45 32 2e 30 03 01 ff ff 00 21 f9 04 04 
64 00 00 00 2c 00 00 00 00 03 00 02 00 00 [02 04     
84 21 a0 00 00] 3b 

// Explanation
02 - Minimum LZW code size
04 - Data sub-block of 4 bytes
84 - 132 in decimal
21 - 33 in decimal
a0 - 160 in decimal
00 - 0 in decimal
00 - Termination byte

Мое изображение выглядит примерно так (почему здесь зеленый, а не красный?).Я испортил изображение, так как 2х3 пикселя немного сложно прочитать.

What the .GIF looks like

Есть ли что-то фундаментальное, чего мне не хватает?Я ценю ваше время, чтобы посмотреть на это со мной.

1 Ответ

0 голосов
/ 03 декабря 2018

Обнаружена ошибка , она заключается в размере кода при сжатии данных изображения LZW.

Когда вы создаете таблицу кодов при сжатии данных изображения с помощью LZW, вам нужно увеличить размер кода, когда вы добавили код, равный 2 ^ (размер кода).Поэтому вместо того, чтобы увеличивать размер кода на единицу после добавления кода 7 | 0 0 0 (как показано в таблице выше), мне нужно было вместо этого увеличивать размер кода на единицу после добавления 8 | 0 1 (поскольку 8 = 2 ^ (размер кода == 3)).

Это то, как данные изображения изменяются путем увеличения размера кода, как описано

100  - 4
000  - 0
110  - 6
000  - 0
0001 - 1
0000 - 0
0101 - 5

И затем, как изменились результирующие байты данных изображения.

10000100 - 132
00010001 - 17
01010000 - 80

Я поставил скобки вокруг данных, чтобы показать сравнение с полными данными .gif, чтобы показать, что изменилось (после применения исправления).Это тот же файл .gif сверху.

47 49 46 38 39 61 03 00 02 00 f1 00 00 b9 7a 56 
ff 00 00 00 ff 00 00 00 00 21 ff 0b 4e 45 54 53
43 41 50 45 32 2e 30 03 01 ff ff 00 21 f9 04 04
64 00 00 00 2c 00 00 00 00 03 00 02 00 00 [02 03
84 11 50 00] 3b 

// Explanation
02 - Minimum LZW code size
03 - Data sub-block of 3 bytes
84 - 132 in decimal
11 - 17 in decimal
50 - 80 in decimal
00 - Termination byte
...