Почему в GIF-кодировании / декодировании между блоками так много заполнения - PullRequest
0 голосов
/ 30 декабря 2018

Я работал над пользовательским GIF-декодером для проекта, над которым я работаю, и который требует как можно меньше данных GIF для хранения в ОЗУ (настолько эффективно, что я вытаскиваю все из файла по мере необходимостиэто, побайтово).

Я работал над следующим учебником:

http://matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp

с небольшой помощью самой спецификации:

https://www.w3.org/Graphics/GIF/spec-gif89a.txt

С моим декодером я могу сделать как анимированный GIF, так и анимированный светофор.Но когда я пытаюсь пройти через GIF, экспортированный с www.piskelapp.com (который использует gif.js в качестве экспортера), я получаю много отступов между различными блоками, отступы, где в некоторых случаях не должно быть в соответствии сСпецификация.

Например, следующая анимация https://www.piskelapp.com/p/agxzfnBpc2tlbC1hcHByEwsSBlBpc2tlbBiAgICA_eOjCgw/edit имеет начало, которое выглядит следующим образом:

47 49 46 38 39 61 20 00 20 00 F7 00 00 00 00 00 4E 4E 4E FF FF 00 00 00 00 00

Первые 6 байтов должны быть заголовком (GIF89a в ASCII)и следующие 7 должны быть дескриптором логического экрана (LSD).Учитывая приведенную здесь информацию, сразу же следует последовательность данных о цветах, соответствующих количеству цветов в ЛСД.Но это не так, это всего лишь 3 00, 3 "4E" и 2 "FF", за которыми следует строка 00, которая продолжается 760 байт.После этого 760 я прихожу к расширению графического управления (которое ожидается и обозначается 0x21).Это происходит между многими из следующих блоков, за исключением того, что я не вижу кодов расширения любого вида, где я ожидал бы, и при этом я не вижу дескрипторы изображения в правильных местах (которые должны начинаться с 2C).

Короче говоря, я что-то упускаю из спецификации?Что все это, как выглядит, отступы и как я могу это обойти?Я видел другие типы этого отступа в других файлах GIF, использующих другие кодировщики, и, похоже, нет единого кода, который я мог бы найти.Файл работает в Windows Photos, поэтому я должен что-то упустить.

1 Ответ

0 голосов
/ 12 апреля 2019

Ответ довольно прост.Экспортер GIF, используемый Piskel, просто плохо реализован.

В спецификации GIF89a явно указано:

"Формат обмена графической информацией (см), указанный здесь, следует считать завершенным; любое отклонение от него следует считать недействительным, включая, но не ограничиваясь, использование зарезервированных или неопределенных полей в блоках управления или данных, включение посторонних данных в или между блоками, использование методов или алгоритмов, специально не перечисленных как часть формата, и т. д. "

ЧастьЯ хочу отметить, что «включение посторонних данных внутри или между блоками».В этом случае проблема заключается в данных внутри блоков, поэтому экспортер Piskel по какой-то причине всегда заполняет таблицы цветов (глобальные и локальные) черным цветом для всех оставшихся пробелов.Я понял это после того, как обнаружил, что реализация декодирования может быть неправильной, что вызывало проблемы при нажатии на повторяющиеся «черные» (# 000000) цветовые коды.

Более подробную информацию можно найти в самой спецификации, расположенной здесь:

https://www.w3.org/Graphics/GIF/spec-gif89a.txt

...