У меня проблемы с пониманием того, как сжимать данные изображения для спецификации 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](https://i.stack.imgur.com/oPC40.png)
Есть ли что-то фундаментальное, чего мне не хватает?Я ценю ваше время, чтобы посмотреть на это со мной.