Пользователь
0,0
рейтинг
17 августа 2012 в 02:17

Разработка → True-Color GIF перевод

Случайно наткнулся, был сильно удивлен:

True Color GIF image
(32697 colors, 184565 bytes)
image


Quantized GIF image
(256 colors, 54197 bytes)


Dithered GIF image
(101 colors, 48069 bytes)


Три изображения демонстрируют разницу между спектром в 32697 цветов и его квантизацией до 256 и дизерингом до 101. Все три рисунка в формате GIF. Все три отвечают спецификации формата GIF89A, в опубликованном Compuserve виде (и все три без компрессии).
Разница в том, что первое изображения было создано с помощью библиотеки ANGIF, непосредственно из буфера данных программы, создавшей true color спектр в 217x217px изображении.

Ошибочное мнение, что GIF имеет лимит в 256 цветов, вероятно восходит своими корнями к 80'м, когда видео карты, в своем большинстве, не поддерживали больше 256 цветов.
Обмен картинками становился все более популярным среди BBS и интернет пользователей, так что разнообразные viewer'ы были быстро написаны.

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

Все конвертеры в GIF использовали различные способы урезать количество цветов до 256. И все GIF состояли лишь из одного блока изображения, несмотря на то, что стандарт GIF некоим образом не ограничивает количество блоков.
Но так как не было смысла использовать больше 256 цветов, то не было и смысла использовать больше одного блока.

Сия практика укоренилась в IT культуре и в конце-концов все 'знали' что GIF не поддерживает больше 256 цветов.

На самом деле, программы, использовавшиеся для генерации GIF не поддерживали больше 1 блока, а следовательно и не могли справиться с более чем 256 цветами. Первое изображение показывает что GIF таки может быть более чем 256 цветным.

Но, чем больше цветов тем больше размер файла. Каждый блок изображения имеет свой хедер и таблицу цветов, в добавок к плохой компрессии. А в случае с ANGIF, компрессии нет совсем (из-за патентных ограничений LZW прикрутить нельзя).
Таким образом, >256 цветная гифка начинает очень быстро набирать вес. Если нет какой-то особой нужды (например, необходимо показать truecolor изображение в браузере непонимающим PNG), truecolor GIF не должна использоваться.

Использование более 256 цветов в GIF, является плохой идеей, в большинстве случаев, и должно быть ограничено определенными случаями, где не страшен огромный 'вес'.
Утверждение что формат изображений GIF ограничен 256 цветами ошибочно.

UPD#1: заметка bolkо попытке создания truecolor gif анимации, написана в Авг 2011
UPD#2: последнее изменение на странице-источнике перевода было в Oct 2006, а ANGIF first rough beta release датирован Jan 2001
UPD#3: Лебедев в 1998 году писал об этом с точки зрения веб-дизайна
Перевод: I Dont Know
@banderlog
карма
9,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (57)

  • +34
    У меня одного первая картинка долго отрисовывалась? Интересно, остальные уже отображаются, а первая заполняется как шахматное поле маленькими клеточками примерно в течение 3 сек. Браузер Chrome.
    • +55
      Она отрисовывается в прямом смысле. Это GIF-анимация.
      • +11
        Не думаю, после рефреша страницы эффект не повторился.
        • 0
          Если бы была анимация, была бы такая же отрисовка. А так, видимо, отрендеренная страница отобразилась из какого-то буфера.
          • +2
            Забавно, если попытаться сохранить 173 кадра через GIMP с 0ms интервалом, то GIMP матюкнется и скажет что сам встраивает задержку дабы 'не перегружать процессор сложной анимацией'.

            Так что постепенная отрисовка может быть частью какого-то механизма защиты от пиковых нагрузок, в связи с тем что браузеры вряд ли подозревают о существовании многоблочных truecolor GIF )
            • +2
              Необязательно защита, это может быть и намеренно добавленная пауза для корректной отрисовки других изображений (я не про GIMP, я вообще). Например, когда в Total Commander была добавлена встроенная (без плагинов) поддержка GIF-изображений, пользователи тут же стали натыкаться на самые разные картинки, у которых анимация шла с реактивной скоростью, тогда как во всех программах-просмотрщиках скорость была нормальной. И автору Тотала пришлось добавлять принудительную задержку между кадрами (конфигурируемое минимальное значение паузы).

              Так что, судя по всему, имеет место быть порочный круг, когда разные пользователи продолжают плодить кривые гифки с нулевой паузой, не зная, что это неправильно, потому что во всех программах они показываются нормально. А разработчики программ не могут убрать паузу, потому что тогда все эти гифки начнут отображаться некорректно, и пользователи будут недовольны.
          • +8
            Это анимация, гимп показывает 173 кадра с 0-й задержкой.
            Принцип действия, на сколько я понимаю, — не более 256 цветов в одном слое, моментальная покадровая отрисовка и вуаля — полноцветное изображение.

            Вот только не учтено, что сам рендеринг у программ может быть разный, как пример, вставляются дополнительные паузы между кадрами.
            • +1
              Такой таймаут в формате не описан, по этому браузеры отрисовывают его как хотят, а при повторной загрузке изображение берется из кэша
        • +6
          У меня после Ctrl+F5 эффект повторился.
        • +1
          У меня повторяется из раза в раз.
          • +1
            На каждом скроллинге отрисовка начинается сначала.
            • 0
              Забавно, что только при сколлинге вверх.
              • +3
                Опера чтоли?
              • 0
                В опере анимация Гифа перезапускается, если гиф полностью исчезал с экрана. Похоже, это фича.
            • 0
              у меня такого не наблюдается, кстати закешировалась и теперь не перерисовывается пока ф5 не обновишь. FF 14.0.1
      • +6
        Это не совсем анимация.
        Там 173 блока (GIMP видит их как кадры с с задержкой в 0ms), т.е. оно должно отрисовываться мгновенно.
        В каждом блоке-кадре не более 256 уникальных цветов, если их сложить, то будет 32697.
    • +30
      3 секунды? Это еще хорошо. У меня оно секунд 20 рисуется.
      • +4
        Ага, секунд 10-15, что в Опере, что в Хроме. Только в опере перерисовывается каждый раз, когда картинка исчезает из поля зрения.
      • +1
        У меня в Firefox тоже секунд 20.
      • +7
        Стоит запостить баг во всех браузерах ;)
      • +1
        Видели бы вы как в ACDSee эта картинка рисуется…
        Тоже медленно, так еще и некорректно, фон переливается всеми цветами, а квадратики «пачкаются»черными полосасми.

        image
        • 0
          В XnView рисуется нормально, но уходит в цикл. Поэтому насладиться полным видом картинки не удаётся.
  • +3
    Я так понимаю, первое изображение это анимация, а не особенность отрисовки?
    И кстати, это изображение некорректно отображается в локальном viewer'е (использую gpl Imagine) – последовательно показываются все цвета вместо градиента.

    А вообще очень удивили! Спасибо за информацию!
  • 0
    И, кстати, если это анимация, то насколько меньше размер этого же изображения с одним кадром?
    • 0
      если все блоки-слои слепить в один то уже не будет truecolor, а размер будет как у второй картинки
    • +2
      даже если просто попытаться пересохранить этот файл, то будет 256 цветов, только в 173 кадрах
  • +8
    Никто не пытался создать изображение больше 256 цветов

    http://bolknote.ru/2011/08/12/~3364
    • +2
      Не думаю что неизвестный англоязычный, предположительно весьма бородатый, автор читал русскоязычный блог bolk'а)

      Хотя я не удивлен что именно bolk пытался ковырять truecolor GIF
      • +2
        Не думаю что неизвестный англоязычный, предположительно весьма бородатый, автор читал русскоязычный блог bolk'а)

        Ну, как раз через десяток копипастов и переводов за год и дошло :)
        • +1
          Последнее изменение на странице-источнике перевода было в: «Вто 03 Окт 2006 05:11:59»
          ANGIF был еще раньше: first rough beta release.датирован 30 Jan 2001 06:12

          Но, судя по всему, мало кто знал об этом )
          • +5
            Вообще-то Лебедев об этом ещё в 98 году писал (архив, кодировка KOI8).
            • 0
              ok.
              Не думаю что неизвестный англоязычный, предположительно весьма бородатый, автор читал русскоязычный сайтик Лебедева
            • 0
              интересно, читал ли Лебедева bolk
  • +13
    В общем, это оказывается любопытным и малоизвестным фактом, который имеет малую практическую пользу.
    • 0
      Да лаааадно… теперь прыгающие гифки на народе будут еще красивее!
      • 0
        Не будут. В примере показана анимация с нулевой задержкой. И все равно рендерится очень долго. А это, считайте, всего лишь 1 виртуальный кадр.
  • +3
    Интересно, но на каждый слой всё равно не больше 256 цветов…
    Кстати, как всегда решение глючит в ИЕ9. Появляются вертикальные белые полосы между фреймами, а при изменении масштаба и вовсе сетка, пруф:
    Скрытый текст
    А если по правому меню «скопировать», то копируется только первый слой (маленький красный квадрат).
    • +1
      В Opera еще веселее, квадратики появляются на черном фоне, и когда скролишь чуть-чуть вниз, то картинка начинает заново перерисовываться (если она еще не успела отрисоваться до конца). Потом когда картинка отрисована, стоит сделать чтобы картинка ушла из области видимости (скролинг, переключение на другую вкладку), и при возврате она снова перерисовывается.
      Смотрел в Opera 12.
      • +1
        при возврате она снова перерисовывается.

        Вот именно эта часть, насколько я знаю — не бага, а фича. Вся анимация перерисовывается при уходе и входе в область видимости.
        • +2
          Это таки бага. Если в гифке прописано, что анимировать один раз, то только в случае перезагрузки страницы оно должно переанимировать заново.
  • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    Ощущаю себя обезьяной из известного эксперимента.
  • 0
    Надо порыться в спецификациях, может GIF еще и альфа-канал поддерживает :)
    • +4
      Всегда поддерживала. Правда, однобитный.
      • 0
        Не поддерживала. Это не альфа-канал называется, а бит прозрачности. Альфа-канал отвечает за полупрозрачность.
        В 8-цветных изображениях (3 бита, по одному на каждый канал) никому не приходило в голову биты каналами называть.
  • +2
    А true color разьве не 16777216 цветов
    • +1
      а кто мешает? Только слоёв будет ооочень много
      • +2
        Мешает, наверное, здравый смысл.
  • +3
    А что, хороший бенчмарк для браузеров, кто быстрее отрисует эту гифку)
  • +1
    У меня при повторной загрузке страницы отрисовывается моментально.
  • 0
    Ну в статье как обычно «не вся правда» :) таки палитра гиф изображения ограничена 256 цветами. Другое дело что цвета в палитре заданы реальным truecolor. В этой гифке использовали «фичу» анимации и видимо для разных кадров умудрились выставить разную палитру.
  • +3
    Такие GIF-ы стары как мир. Многие не знают о такой возможности и в основном из-за того, что программы в большинстве своем не предоставляют такую возможность. Мало того, даже программы для просмотра не всегда правильно отображают такие картинки. Браузеры корректно отображают, но время рендера не соответствует спецификации.
    Delay Time — If not 0, this field specifies the number of hundredths (1/100) of a second to wait before continuing with the processing of the Data Stream.

    Process each graphic in the Data Stream in sequence, without delays other than those specified in the control information.

    Как ни странно, обычный Paint открывает такие GIF-ы правильно и без задержек, при том сама система, в проводнике и встроенном просмотре, отображает только первый кадр.

    В своей программе CQ я реализовал возможность записи GIF-ов с любым количеством цветов, кому интересно можете поиграться. От себя замечу, что целесообразность очень сомнительная. Однако для большинства изображений достаточно всего нескольких тысяч цветов и с такими параметрами GIF-ы получаются не такими увесистыми как с полным набором цветов, хотя и больше PNG.


    GIF 3942 цветов / 58,6 кб
    • 0
      а что на счёт исходников? :)
      • 0
        Исходники!? Там пару строк кода =)
        Алгоритм простой:
        — собираем все уникальные цвета
        — упорядочиваем (от способа будет зависеть эффект прорисовки и конечный размер файла)
        — разбиваем все это дело на куски по 256 цветов (локальные палитры для каждого кадра)
        — пишем кадры из имеющихся локальных палитр.
  • +2
    Если первая гифка отрисовывалась по квадратикам, то эта — как художник кисточкой снизу вверху рисовал.
  • +1
    Так это же Progressive JPEG!!! :D
  • 0
    в Андроидном браузере первое изображение сплошной красный цвет.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.