Я с детства сижу на форумах, и сколько помню — на глаза то тут то там попадалась гифка с ползающей по экрану букашкой. Недавно гуглил что-то, и забрёл на freshports.org, где прямо в шапке была та самая гифка.

И тут захотелось сделать пасхалку с этой гифкой на своём сайте. Чем я там занимался до этого? Уже было не важно, ведь пасхалки делать всегда веселее! :) Сделал пасхалку, проверил как работает — выглядит прикольно. Глянул на телефоне — ммм, выглядит размыто, хорошо бы найти версию гифки с разрешением повыше...![]()
Так начался проект по поиску оригинала, который перерос в историю с несколькими неожиданными поворотами. Я и не догадывался, насколько глубокая кроличья нора ждала меня впереди.
Поиски оригинала. Снова?
Итак, что мы имеем? Какое-то месиво из пикселей, где без характерной анимации и букашку-то узнать сложно:
![]()
Первый поиск выдал наверное сотню вариаций этой анимашки. Отличались размеры, отступы, наличие прозрачности, задержки между кадрами, паузы или их отсутствие, часто изображение было повёрнуто или отражено, но во всех случаях букашка бегала по идентичной траектории, что было очевидно при покадровом сравнении после нормализации размера и ориентации изображения. По-видимому, оригинальная версия появилась так давно, что за прошедшие годы множество разных людей приложило к ней руку, создав какие-то свои вариации.
Но главное — один из первых результатов имел явно больше деталей, что подтверждало предположение о существовании исходной версии более высокого разрешения. Однако, несмотря на большее количество деталей, он выглядел как растянутая версия некоего гипотетического оригинала, о чём говорила характерная размытость:
![]()
Результаты поиска были забиты вариациями повышенной шакальности из-за многочисленных перезаливов на сервисы, которые пережимали и растягивали анимацию на свой лад. Например, gifdb.com влепил свой водяной знак и растянул аж до 2.7-мегабайтного файла. Я начал сохранять все найденные вариации относительно нормального качества, чтобы проанализировать и прокатегоризировать находки в поисках того, что потенциально ближе всего к оригиналу.
Когда собралась небольшая коллекция — пошёл в папку, где я собираю любопытные гифки, чтобы создать там подпапку, посвящённую этому мини-проекту... И тут внезапно обнаружилось, что у меня уже была коллекция файлов с этой букашкой, поскольку я уже занимался поиском оригинала этой гифки в далёком 2019-ом. Вот это поворот! Я уже успел совсем забыть об этом, 2019-ый был считай что в другой жизни.
По сохранившимся заметкам за то время, в предыдущий раз на поиски меня стриггерил аватар на форуме Total Commander, причём его файл оказался идентичен файлу из шапки freshports.org, что стриггерил меня в этот раз. Разве не забавное совпадение? Ну что ж, оригинал я тогда так и не нашёл. Может, получится в этот раз?
Довольно быстро нашёлся этот вариант:
![]()
Если бы он попался мне самым первым, он мог бы сойти за оригинал, и я бы наверное не стал бы заниматься углубленными цифровыми археологическими раскопками. Изображение довольно чёткое, могло бы сойти за оригинал, если бы не заметно меньшее количество деталей, по сравнению с найденным первым размытым оверсайзнутым вариантом.
В какой-то момент в случайной подборке гифок для Хэллоуина 2011 года на LiveJournal нашёлся вариант получше, который казался достаточно чётким, очень уж походил на оригинал:
![]()
Все детали на месте, без излишней размытости. Однако, немного смущало то, что в углу анимации зачем-то были какие-то непонятные анимированные астериски, которые нигде больше не встречались. Поэтому на всякий случай продолжил поиски.
В целом, поиск продолжался уже пару часов. Азарт поддерживало то, что каждые полчаса находилась вариация лучше предыдущей. Ощущение того, что оригинал где-то совсем рядом и вот-вот найдётся, заставляло погружаться в эту кроличью нору всё глубже. Когда терпение уже было на исходе, и я был готов бросить эту затею, мне на глаза попался этот файл. На первый взгляд показалось, что здесь изображение того же качества, что и в предыдущем варианте, зато анимация обрезана до минимально необходимых размеров, и не было тех непонятных анимированных астерисков в углу.
Когда же я увеличил изображение, чтобы рассмотреть пиксели, эндорфин подскочил до предела — перед нами идеально точное попадание в пиксели:
![]()
Похоже, что это — тот самый файл! К тому же, этот вариант гифки довольно эффективно сжат — всего 7251 байт. Очень старомодно!
Те самые 7251 байт! Или на самом деле 4394?

Используем GIF Explorer для анализа.
Самая первая маленькая гифка, с которой всё началось, была размером 56×50 пикселей и весом 5407 байт; 30 кадров; задержка между кадрами — 50 мс с двумя паузами на 1 секунду; палитра — 8 бит, 6 цветов с индексами 0-5 (#000000, #333333, #666666, #999999, #CCCCCC, #FFFFFF — это все чёрно-белые цвета из классической web-safe палитры родом из 90-х), при этом белый (индекс 5) по совместительству используется как прозрачный.
В найденной гифке размеры 100×120 пикселей и вес 7251 байт; 30 кадров; задержка между кадрами — 80 мс без пауз; изображение повёрнуто на 90°; палитра — 3 бита, 6 цветов с индексами 0-5 (#000000, #313131, #636363, #9C9C9C, #CECECE, #FFFFFF — странно, что это почти web-safe палитра, но цвета всё же немного отличаются, хоть и незаметно глазу), при этом почему-то в качестве прозрачного задан индекс 7, который не используется, то есть фон здесь в итоге белый. Такое впечатление, что прозрачность отсутствует по ошибке.
Самое интересное, что обнаружилось — найденная гифка на самом деле весит 4394 байта, за которыми идут 2857 байт какого-то подозрительного мусора. То есть найденная гифка аж на 1013 байт меньше, чем наша изначальная маленькая гифка, с которой всё началось, хотя в новом файле у нас в 4 раза больше пикселей. Неплохо!
Что за 2857 байт мусора в хвосте? Уязвимость aCropalypse на практике
Любая полноценная гифка должна заканчиваться на байт 0x3B (Trailer Byte). Подозрительно, что найденный мусор заканчивается именно на 0x3B, который так же имеется в конце реальных 4394 байт. Очень похоже на результат нашумевшей в 2023 году уязвимости класса aCropalypse, которая так же применима для GIF. То есть, некий редактор GIF при сохранении открытого файла не очищал существующий файл, а просто писал новые данные поверх, и если новых данных получалось меньше чем было (например, в результате обрезки или оптимизации изображения), хвост оригинального файла оставался сразу за записанными данными нового файла, и общий размер файла из-за этого не менялся.
Вот уж не думал, что столкнусь с результатом такой уязвимости лицом к лицу, когда читал новости про aCropalypse в 2023 году. И уж тем более не думал, что мне захочется восстановить и изучить содержимое этого хвоста. Приступим!
Более детальный осмотр этих данных выявил 13 валидных заголовков Graphics Control Extension и Image Descriptor, которые в точности совпадали с кадрами 18-30 нашей анимации из первых 4394 байт. Таким образом, мы имеем дело с неоптимизированной версией исходной анимации! Судя по уцелевшим заголовкам фреймов, в ней использовалась 8-битная палитра. Таким образом, при уменьшении палитры с 8 бит до 3 бит, размер данных уменьшился с 7251 до 4394 байт, но из-за ошибки в коде сохранения, файл остался 7251 байт, где последние 2857 байт остались от неоптимизированной версии файла.
Было очень интересно восстановить уцелевшие кадры и изучить, нет ли там каких-то заметных отличий. Немного поколдовав с ChatGPT, удалось сгенерировать подходящий префикс размером 4394 байт, который содержал необходимые для GIF-файла заголовки, гипотетическую 8-битную палитру, пустой холст 100×120 пикселей, и блок типа comment в качестве паддинга, чтобы направить декодер сразу на заголовок первого уцелевшего фрейма. Дописываем к этому префиксу наши уцелевшие 2857 байт мусора, и получаем рабочий GIF-файл, который можно декодировать и изучать. Таким образом, удалось декодировать все уцелевшие фреймы:

Оказалось, что хоть здесь и 8-битная палитра, в данных изображения используются только индексы 0, 43, 86, 129, 172 и 215, плюс 215 как Background Color Index и 216 как Transparent Color Index. То есть, даже неоптимизированное изображение на самом деле использовало всего 6 цветов!
Судя по индексам неоптимизированной версии, они не были случайными. Перед нами классическая палитра из 216 web-safe цветов (6×6×6 или Netscape Color Cube, была популярна на заре интернета в 90-х), где как раз было всего 6 чёрно-белых цветов (#000000, #333333, #666666, #999999, #CCCCCC, #FFFFFF), и они обычно находились именно на индексах, которые мы увидели в декодированных данных (0, 43, 86, 129, 172, и 215).
Таким образом, найденный хвост неоптимизированной версии подтверждает, что палитра с самого начала была web-safe, и остаётся загадкой, почему в финальном оптимизированном изображении значения серых цветов немножко (незаметно глазу) сдвинулись от стандартных web-safe значений. Возможно, используемый оптимизатор не только криво сохранял файлы, но и немного искажал цвета, хотя необходимости в этом нет, так как цвета палитры в GIF хранятся без сжатия, и на размер финального файла их значения не влияют.
Патчим гифку — реальные 4394 байта
Берём найденный файл, отрезаем лишний хвост — и получаем крохотный файл размером 4394 байта. Неплохо!
Но не хватает прозрачности. Можно, конечно, воспользоваться любым редактором гифок, чтобы исправить этот досадный недостаток. Но при сохранении он пережмёт оригинальное изображение — это скучно и неинтересно. Можно ли обойтись без этого? Конечно, можно просто исправить несколько байт в оригинальном файле при помощи HEX-редактора, что уже веселее! Для этого нам пригодятся описание внутренностей формата GIF и подробности про прозрачность и анимацию.
Для начала, вернём каноничные web-safe цвета. Патчить палитру проще всего — она никак не сжата и её сразу видно. Просто заменяем #313131, #636363, #9C9C9C, #CECECE на каноничные #333333, #666666, #999999, #CCCCCC — и готово!
А что с прозрачностью?

Всё что нам нужно — это заменить указанный в заголовках Logical Screen Descriptor гифки неверный Background Color Index с 6 на 5, который реально используется для фона; и в заголовках Graphic Control Extension каждого из 30 фреймов нужно заменить Transparent Color Index с 7 на 5 (чтобы сделать фоновой цвет прозрачным) и Disposal Method с 1 (none) на 2 (background, чтобы пиксели предыдущего кадра корректно затирались фоновым цветом).

Disposal Method является частью байта Packed Field, в котором находятся и другие флаги. В фреймах исходного изображения стоит флаг Transparent и Disposal Method = 1. То есть 0b00000101=0x05 согласно картинке выше. При Disposal Method = 2 получится 0b00001001=0x09. Заменяем это всё в заголовках, и вуаля — пропатченная версия с рабочей прозрачностью!
Отлично! А можем ли мы исправить задержки? Движение в первой маленькой гифке с паузами выглядит интереснее.
Конечно! За это у нас отвечает Delay Time в Graphic Control Extension каждого фрейма, которое указывается в единицах по 10мс. В самой первой гифке у нас задержки 50 мс, с паузами на 1 секунду на 10-ом и 20-ом фреймах. В найденной гифке все задержки по 80 мс. Заменяем все задержки с 80 мс до 50 мс заменой значения 0x08 на 0x05 в соответствующем байте Graphic Control Extension. Получилась немного ускоренная и более плавная анимация. А теперь добавляем секундные паузы для фреймов 10 и 20, заменив для них 0x05 на 100=0x64, и — получаем желанное!

Правда, повернуть изображение гифки таким образом не получится. Для этого всё же придётся перестроить и пережать содержимое всех кадров. Но патчить ошибки в оригинальной гифке всё равно было довольно весело :)
6 цветов, 30 кадров — и ни одного лишнего байта
4394 байта — неплохо, но можно ли ещё легче? Можно! Оптимизируем пропатченную гифку без потерь в качестве при помощи Gifsicle и FlexiGIF, заодно поворачиваем её на 90° для соответствия той версии, с которой всё началось, таким bat-скриптом:
gifsicle --rotate-90 -O3 --no-comments --no-names original_patched_with_stops.gif ^
--use-exact-colormap=original_patched_with_stops.gif -o rotated_optimized_gifsicle.gif ^
&& flexigif -f -p rotated_optimized_gifsicle.gif rotated_optimized.gif ^
&& del rotated_optimized_gifsicle.gif
Как вариант, можно было пропустить всё веселье ручного патчинга и получить идентичный результат на основе исходной непропатченной версии, выполнив такой bat-срипт:
@> "colormap.txt" (
@echo #000000
@echo #333333
@echo #666666
@echo #999999
@echo #CCCCCC
@echo #FFFFFF
@echo #FFFFFF
@echo #FFFFFF
)
gifsicle --unoptimize --transparent="#FFFFFF" --disposal=background --rotate-90 --no-comments --no-names original.gif ^
--delay=5 "#0-8" --delay=100 "#9" --delay=5 "#10-18" --delay=100 "#19" --delay=5 "#20-29" --optimize=3 ^
--use-exact-colormap=colormap.txt -o rotated_optimized_gifsicle.gif ^
&& flexigif -f -p rotated_optimized_gifsicle.gif rotated_optimized.gif ^
&& del rotated_optimized_gifsicle.gif ^
&& del colormap.txt
Получился оптимизированный GIF-файл объёмом всего 3896 байт:

Сравните с изначальной маленькой версией, которая весила 5407 байт (масштаб 200%):

Доработанный Gifsicle
Попутно я столкнулся с парой проблем в Gifsicle и FlexiGIF, исправление и обход которых было дополнительным сайд-квестом:
- Gifsicle не сохранял заданную в --use-exact-colormap палитру при включённой оптимизации --optimize=3.
- Gifsicle изредка выдавал немного невалидный файл с обрезанным маркером EOI (end-of-image). Браузеры прощают эту ошибку, из-за чего проблема многие годы оставалась незамеченной, но это нарушение спецификации, и FlexiGIF отказывается читать такие файлы.
Я предложил автору Gifsicle свои исправления, но он решил исправить найденные проблемы по-своему и полностью переписал предложенный код. Приведённые выше bat-скрипты нужно выполнять именно на свежей версии Gifsicle v1.98+.
Поскольку автор Gifsicle не предлагает готовую сборку программы для Windows, я собрал её для вас: gifsicle.7z.
APNG и WebP с альфа-каналом
Поскольку палитра GIF состоит исключительно из оттенков серого, изначально обозначавших степень прозрачности, но ставших непрозрачными из-за ограничений формата, естественным следующим шагом становится создание APNG с полноценным альфа-каналом.

Используем ffmpeg для конвертации, и apngopt вместе с oxipng для оптимизации:
ffmpeg -i rotated_optimized.gif -vf "format=rgba,geq=r=0:g=0:b=0:a='alpha(X,Y)*(255-r(X,Y))/255'" ^
-plays 0 -f apng rotated_optimized_ffmpeg.png ^
&& apngopt -z2 -i100 rotated_optimized_ffmpeg.png rotated_optimized.png ^
&& oxipng -o 6 -z --strip safe --alpha rotated_optimized.png ^
&& del rotated_optimized_ffmpeg.png
Получаем оптимизированный APNG с аккуратным альфа-каналом:

Даже после оптимизации несколькими инструментами APNG занял 5158 байт — старичок GIF справился с этой задачей гораздо лучше (3896 байт).
Для полноты сравнения, я также конвертировал эту анимашку в оптимизированный lossless WebP (при помощи img2webp.exe -lossless -q 100 -m 6 -min_size) — получилось 4546 байт. Надо же, GIF и его уделал!
Сравнительная таблица оптимизированных версий анимации в разных форматах:
| GIF | 3896 байт |
| APNG | 5158 байт |
| WebP | 4546 байт |
Не планировал я устраивать гонку форматов, но в итоге я искренне удивлён, что старенький GIF всех уделал. Ведь по сути в данном случае все файлы содержат одинаковое количество графической информации, а для представления степени прозрачности в палитре из 6 цветов требуется всего 6 дополнительных байт.
В каком году была создана оригинальная гифка? Китайский след
Перед тем, как публиковать статью, для полноты картины, я хотел точнее узнать, когда эта гифка могла появиться на свет. Поэтому занялся поисками пруфов самого раннего использования этого файла.
Поиск ранних примеров шёл туго. Через веб-архив удалось установить, что аватарка на форуме Total Commander была там уже в декабре 2013, а этот же файл, но с ироничным именем notbug.gif, был доступен на freshports.org по крайней мере с января 2012 (дата попадания файла в веб-архив видна в URL). Это не очень впечатляет, так как даже ранее рассмотренная версия с анимированными астерисками засветилась в подборке гифок для Хэллоуина 2011 года. Изучение оригинальных заголовков notbug.gif из веб-архива сдвинуло самую раннюю известную дату на март 2011:
C:\Users\VEG>curl -sI "https://web.archive.org/web/20120125155043im_/http://www.freshports.org/images/notbug.gif" HTTP/1.1 200 OK Content-Type: image/gif Content-Length: 5407 x-archive-orig-date: Wed, 25 Jan 2012 15:50:43 GMT x-archive-orig-server: Apache/2.2.20 (FreeBSD) mod_ssl/2.2.20 OpenSSL/0.9.8q DAV/2 PHP/5.3.9 x-archive-orig-last-modified: Mon, 07 Mar 2011 00:49:06 GMT
На нескольких (в основном русскоязычных) сайтах нашлась интересная производная работа с «танцующими» букашками:

Каждая букашка в точности повторяет траекторию движения оригинала. Исходная анимация многократно отражена и продублирована по принципу калейдоскопа, что создаёт забавный эффект танца.
Самый ранний пруф использования этой версии анимашки нашёлся в январе 2010. А вот внутри этого файла нашёлся комментарий внезапно на китайском языке (в кодировке GB2312):
★贪婪大陆☆我的过去好像梦〖XG】
看似浮云收放不能,看似凡人默默耕耘...
Что в переводе ChatGPT звучит примерно как:
★ Жадный континент ☆ Моё прошлое словно сон [XG]
Словно плывущие облака — их не удержать;
словно обычный человек — молча трудится...
Ничего не понятно, но очень интересно. По-видимому, это что-то на поэтичном. ChatGPT предположил, что «Жадный континент» является отсылкой на популярный в нулевых и закрытый в 2011 китайский анимешный сайт greedland.net и его форум с зеркалом. Возможно, эта вариация анимации была впервые опубликована именно на этом сайте, а «[XG]» — отсылка к автору.
Это зацепка! Исследуем китайский интернет. Неожиданная находка
Раз уж последняя находка была связана с китайским сайтом, вооружился переводчиком и пошёл искать в китайском интернете на Baidu — это как раз то место, где я ещё почти не смотрел.
Сразу же нашлось народное творчество с целым роем насекомых:

И ещё несколько производных работ с множеством букашек, иногда менее удачных и плохо зацикленных. Все они составлены из исходной гифки с одной букашкой — траектория движения каждой из них та же.
Но всё это были довольно свежие примеры использования, а я всё ещё искал пруф самого раннего использования. Как вдруг на каком-то китайском сайте я нашёл это... В веб-архиве ранее не было этого файла, но на самом сайте указана дата загрузки 2009-04-26, что оказалось самым ранним примером использования на этот момент.
Более того, это была анимация в исходном размере, но с непонятным добавленным отступом справа (160×120 вместо 100×120). Каково же было моё удивление, когда обнаружилось, что этот файл весит ровно 7251 байт, как и тот файл, который мы до сих пор считали оригиналом.
Что?! Это исходный неоптимизированный оригинал?
При побайтовом сравнении оказалось, что это и есть тот самый неоптимизированный оригинальный файл, хвост которого я так старательно восстанавливал — все 2857 байт в хвосте целиком совпадают!
Палитра только что найденной гифки — как раз 8-битная web-safe, и серые цвета в ней без искажений, как и предполагалось. Координаты жучка при оптимизации неизвестным автором не изменились, потому что обрезанный отступ справа никак не влиял на само изображение. Зачем вообще этот отступ был нужен? Непонятно.
Тем не менее, теперь у нас есть настоящий неоптимизированный оригинал. Если обрезать пустые пиксели справа (до 100×120), повернуть на 90°, и оптимизировать гифку тем же беспотерьным способом, что мы использовали и для нашего «первого оригинала» с восстановленной вручную web-safe палитрой — получится идентичный файл.
@> "colormap.txt" (
@echo #000000
@echo #333333
@echo #666666
@echo #999999
@echo #CCCCCC
@echo #FFFFFF
@echo #FFFFFF
@echo #FFFFFF
)
gifsicle --unoptimize --transparent="#FFFFFF" --disposal=background --loopcount=forever ^
--crop=0,0-100,120 --rotate-90 --no-comments --no-names original_unoptimized.gif ^
--delay=5 "#0-8" --delay=100 "#9" --delay=5 "#10-18" --delay=100 "#19" --delay=5 "#20-29" --optimize=3 ^
--use-exact-colormap=colormap.txt -o rotated_optimized_gifsicle.gif ^
&& flexigif -f -p rotated_optimized_gifsicle.gif rotated_optimized.gif ^
&& del rotated_optimized_gifsicle.gif ^
&& del colormap.txt
То есть, по реальному содержимому пикселей оба варианта оригинала не отличаются — реально используется только 6 цветов, и разница только в оптимизации, размерах холста, и немного искажённой палитре. Даже не имея реального оригинального файла на руках, мы смогли получить тот же результат, совпадающий байт-в-байт.
Раз уж в интернете нашлись две версии оригинала (с 8-битной web-safe палитрой, и с 3-битной оптимизированной палитрой) — мы можем осторожно предположить, что они были сделаны в разное время разными людьми. И тот, кто пробовал сделать оптимизированную версию, не заметил, что после оптимизации у него получился файл того же размера — и загрузил полученную «оптимизированную» версию в интернет. Забавно.
И вот опять... 72-цветный оригинал... 6-цветного оригинала?!
Итак, мы остановились на 2009 году. Память, конечно, может быть обманчивой, но мне почему-то кажется, что я видел её и раньше. Поэтому я ещё раз "в последний раз" взялся за раскопки.
Перебирая одну ссылку за другой, я вдруг наткнулся на вот этот файл (часть плагина cangying 2021 года для китайского движка блогов Z-BlogPHP, просто выводит эту гифку на страницах). Внешне этот вариант выглядел как уже известный нам оригинал размером 160×120 пикселей. Однако, тут полноценный прозрачный фон, и файл немного потяжелее — 7706 байт, что на 455 байт больше нашего оригинала. В чём дело? Принялся детально изучать новинку.
Наш 6-цветный оригинал:
![]()
Только что найденный файл:
![]()
Как оказалось, в этой вариации используется 72 градации серого. Я изучил огромное количество производных этой гифки — везде ключевыми цветами были градации серого из web-safe палитры. Статистика использования цветов найденной 72-цветной версии не исключение: больше половины непрозрачных пикселей — те самые 6 градаций серого из web-safe палитры, а все остальные — их промежуточные производные от 1/4 до 1/64. Это не может быть случайным. Это можно было бы объяснить тем, что это немного обработанная версия нашего 6-цветного оригинала. Но при внимательном рассмотрении каждого кадра это кажется маловероятным — это не похоже на результат искажения исходного изображения. Скорее выглядит так, будто это — оригинал нашего оригинала до конвертации в web-safe палитру с 6 градациями серого.
72-цветную версию можно конвертировать в 6-цветную по следующей схеме, по яркости каждого пикселя от 0 до 255:
0..47 -> #000000 48..90 -> #333333 91..151 -> #666666 152..197 -> #999999 198..223 -> #CCCCCC 224..255 -> #FFFFFF
В результате такой конвертации с нашим 6-цветным оригиналом не совпадают только 36 из 5112 непрозрачных пикселей. Это скорее поддерживает гипотезу о том, что 6-цветная версия получена из 72-цветной. Что касается 36 несовпавших пикселей — скорее всего, после автоматической оптимизации эти пиксели были исправлены вручную, чтобы выглядело получше.
Но почему тогда в 72-цветной версии все опорные цвета — те самые 6 градаций серого? Это можно объяснить тем, что исходная статичная картинка букашки, на основе которой была создана самая первая анимация, тоже изначально была в 6 градациях серого из web-safe палитры, и промежуточные градации серого появились при повороте той картинки на произвольные углы.
Так какого же года гифка?
В файле 72-цветной версии имеется любопытный комментарий на китайском языке (в кодировке GB2312):
试用版: 使用未注册版本的 GIF Movie Gear 4.0 制作 gamani 出品(http://www.gamani.com)
Что значит (триалка GIF Movie Gear добавляла подобный комментарий в каждый созданный файл):
DEMO VERSION : Built with an UNREGISTERED copy of GIF Movie Gear 4.0 from gamani productions (http://www.gamani.com).
А вот это уже интересная отсылка к возможному периоду времени. Согласно официальному сайту GIF Movie Gear, версия 4.0 вышла в 2004 году. Более новые версии (включая самые свежие) продолжают упоминать 4.0 в этом комментарии, так что это даёт нам по крайней мере самый ранний срок появления этого файла.
Когда большая часть материала для этой статьи уже была готова, и статья была уже практически дописана, я случайно заметил уменьшенную версию оригинальной гифки на аватаре на Рутрекере. При запросе файла, сервер отдаёт в заголовках дату загрузки файла 30 мая 2008 года:
C:\Users\VEG>curl -sI "https://static.rutracker.cc/avatars/0/29/3748729.gif" HTTP/1.1 200 OK Content-Type: image/gif Content-Length: 3994 Last-Modified: Fri, 30 May 2008 11:02:22 GMT
Казалось бы, уже хватит... Но до этого момента, оставалась малоизученной зацепка, указывающая на потенциальную связь с закрытым китайским форумом greedland.net. Я выкачал все сохранившиеся в веб-архиве gif-файлы с этого сайта. К сожалению, среди нескольких тысяч файлов, нашёлся только один аватар, и он оказался идентичен тому, что мы только что видели на Рутрекере. Веб-архив проиндексировал его в 2010 году, но сохранил оригинальные заголовки, согласно которым файл был загружен 6 мая 2008 года:
C:\Users\VEG>curl -sI "https://web.archive.org/web/20100615233815if_/http://bbs2.greedland.net/avatars/00/38/66/25/1.gif" HTTP/1.1 200 OK Content-Type: image/gif Content-Length: 3994 x-archive-orig-date: Tue, 15 Jun 2010 23:35:57 GMT x-archive-orig-server: Apache x-archive-orig-last-modified: Tue, 06 May 2008 08:50:49 GMT
Ну и напоследок, на замечательном сайте по поиску старых гифок GifCities я нашёл множество примеров, проиндексированных и сохранённых веб-архивом в 2009 году, когда популярный хостинг домашних страничек GeoCities объявил о своём грядущем закрытии. Самый ранний пример был проиндексирован веб-архивом в июле 2009, а его оригинальные заголовки оказались особенно интересны, так как согласно ним данный файл был загружен на хостинг 23 апреля 2007 года:
C:\Users\VEG>curl -sI "https://web.archive.org/web/20090727234125im_/http://www.geocities.com/gr8fuldaniel/BUG.gif" HTTP/1.1 200 OK Content-Type: image/gif Content-Length: 2666 x-archive-orig-date: Mon, 27 Jul 2009 23:41:25 GMT x-archive-orig-last-modified: Mon, 23 Apr 2007 19:52:57 GMT
В общем, походу наша букашка родом из Китая, и появилась она на свет где-то в 2004-2007 годах.
А кто автор? Где было впервые опубликовано?
¯\_(ツ)_/¯
Боюсь, это так и останется тайной, покрытой мраком. Эта кроличья нора оказалась слишком глубока. Я и так уже неразумно много времени потратил на расследование. Пожалуй, остановлюсь на этом.
Итого
- Нашлась оптимизированная 6-цветная версия с 3-битной палитрой и хвостом от неоптимизированной версии.
- Нашлась оригинальная неоптимизированная 6-цветная версия с 8-битной web-safe палитрой.
- Нашлась оригинальная 72-цветная версия.
- Создан пропатченный и максимально оптимизированный 6-цветный GIF.
- Создан оптимизированный APNG с полноценным альфа-каналом.

Комментарии временно закрыты. Обновите эту страницу через минуту.