{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом gif",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/www.blogengine.me\/blogs\/tags\/gif\/",
    "feed_url": "https:\/\/www.blogengine.me\/blogs\/tags\/gif\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/www.blogengine.me\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "130422",
            "url": "https:\/\/bolknote.ru\/all\/3707\/",
            "title": "Сжатый несжатый GIF",
            "content_html": "<p>Как многие знают, браузер нативно понимает сжатие <i>gzip<\/i> (алгоритм <a href=\"http:\/\/ru.wikipedia.org\/wiki\/DEFLATE\">DEFLATE<\/a>). Наконец-то браузеры научились с ним правильно работать, после стольких лет мучений — сжимать можно что угодно, достаточно просто указать правильный заголовок.<\/p>\n<p>Графический файлы обычно так не сжимают — внутри у них свой алгоритм сжатия, например в <i>ПНГ<\/i> используется тот же <i>DEFLATE<\/i>. Но с ГИФом ситуация хуже — у него внутри более старый алгоритм <i>LZW<\/i>, к тому же нет никаких оптимизационных техник (например, <i>ПНГ<\/i> использует так называемые «фильтры», которые позволяют эффективно сжимать градиенты.<\/p>\n<p>Вот я и подумал — нельзя ли как-то заменить алгоримт сжатия ГИФа с внутреннего <i>LZW<\/i> на внешний <i>gzip<\/i>? Если было бы нельзя, я бы эту заметку не писал.<\/p>\n<p>Смотрите, слева у вас на экране ГИФ, сжатый при помощи <i>gzip<\/i> (так и грузится с сервера), справа — ПНГ.<\/p>\n<div style=\"width: 400px\"><div style=\"width:50%; float:left\"><p><img src=\/imgs\/2012.08.08.gif-gz width=46 height=46><\/p>\n<\/div><div style=\"width:50%; float:left\"><p><img src=\/imgs\/2012.08.08.png  width=46 height=46><\/p>\n<\/div><\/div><p><br clear=\"both\"><\/p>\n<p>В каждом из них равное количество уникальных цветов, ПНГ пропущен через все оптимизаторы, которые я только нашёл. При этом ПНГ занимает 1374 байта, а гзипованный ГИФ — 1347, на 27 байт меньше. Дело тут конечно, не в паре десятков байт, а в принципе — если бы я выбрал картинку побольше, выигрыш, возможно, был бы существеннее.<\/p>\n<p>Почему же <i>LZW<\/i> внутри ГИФа, плюс <i>DEFLATE<\/i> снаружи сделали файл меньше, чем оптимизирующие просто <i>DEFLATE<\/i>, плюс фильтры в случае ПНГ? Обычно наложение одного сжимающего алгоритма на другой делает файл больше сравнению с применением одного, более удачного алгоритам из двоих.<\/p>\n<p>Дело в том, что в ГИФ я использовал <i>несжатый<\/i>, он подготовлен специальным образом, так, что его собственный алгоритм сжатия не работает, а <i>gzip<\/i> работает над несжатым потоком данных.<\/p>\n<p>Самый простой, по моему мнению, способ получить такой файл — пропустить его через утилиту <i>gifinter<\/i> из набора <a href=\"http:\/\/directory.fsf.org\/wiki\/Libungif\">libungif<\/a> — библиотеки и набора утилит для работы с несжатыми файлами ГИФ.<\/p>\n<p>Утилиты эти отлично скомпилировались под мой «Мак» и обрабатывал я ГИФ следующим образом: для начала оптимизировал его при помощи <i>giflite<\/i> (эта старая утилита под <i>DOS<\/i>, которую я запускаю из-под <i>dosbox<\/i>, творит с ГИФами чудеса), потом пропустил через утилиту, вырезающую из ГИФа комментарии (их туда вставил <i>giflite<\/i>), только после этого пропустил файл через <i>gifinter<\/i> и сжал при помощи <i>gzip<\/i>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">gifinter optimized.gif &gt; non-compressed.gif\ngzip -9n non-compressed.gif<\/code><\/pre><\/pre><p>Дальше я переименовал файл в 2012.08.08.gif-gz и добавил в конфигурацию своего «Апача» следующие строки:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">AddEncoding gzip .gif-gz\nAddType image\/gif .gif-gz<\/code><\/pre><\/pre><p>Теперь при запросе сервер будет выдавать все необходимые заголовки:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">bolk@Bolk ~  $ telnet bolknote.ru 80\nTrying 91.230.61.15...\nConnected to bolknote.ru.\nEscape character is &#039;^]&#039;.\nHEAD \/imgs\/2012.08.08.gif-gz HTTP\/1.0\nHost: bolknote.ru\nAccept-encoding: gzip\n\nHTTP\/1.1 200 OK\nServer: nginx\nDate: Wed, 08 Aug 2012 06:12:14 GMT\nContent-Type: image\/gif\nContent-Length: 1347\nConnection: close\nAccept-Ranges: bytes\nCache-Control: max-age=2592000\nExpires: Fri, 07 Sep 2012 06:12:14 GMT\nContent-Encoding: gzip<\/code><\/pre><\/pre><p>Если интересно как устроен несжатый ГИФ, об этом <a href=\"http:\/\/en.wikipedia.org\/wiki\/File:Quilt_design_as_46x46_uncompressed_GIF.gif\">можно прочитать<\/a> в Википедии, откуда я взял картинку, там интересная уличная магия, перепечатывать «Википедию» не очень-то интересно.<\/p>\n<p>Готовой разгадки почему сжатый несжатый ГИФ обогнал ПНГ у меня нет, но есть одно возможное соображение — ГИФ чуть-чуть компактнее ПНГ, кроме того, ГИФ сжат целиком, тогда как в ПНГ сжата только картинка. Если моё предположение правда, то хорошего выигрыша ждать не сто́ит, но списывать формат ГИФ со счетов тоже не нужно.<\/p>\n<p>По-настоящему опыт ценен, если удасться сделать несжатую ГИФ-анимацию (этого я ещё не пробовал) и сжать её при помощи <i>gzip<\/i>. Если удасться, это будет очень полезно, буду держать вас в курсе.<\/p>\n",
            "date_published": "2012-08-08T10:43:00+05:00",
            "date_modified": "2024-08-31T16:55:31+05:00",
            "tags": [
                "gif",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Wed, 08 Aug 2012 10:43:00 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "130422",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "123692",
            "url": "https:\/\/bolknote.ru\/all\/3068\/",
            "title": "Internet Explorer показывает не все GIF",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2011.01.16.gif\" width=\"80\" height=\"80\" alt=\"\" \/>\n<div class=\"e2-text-caption\">IE, не покажи этот GIF!<\/div>\n<\/div>\n<p>Нашёл в ЖЖ DiBR’а <a href=\"http:\/\/dibr.livejournal.com\/357116.html\">GIF, который не показывает Internet Explorer<\/a>. Забавно, хотя в отличие от <a href=\"https:\/\/bolknote.ru\/all\/3050\/\">JPEG, который не показывает современная «Опера»<\/a>, этот GIF несколько некорректен.<\/p>\n<p>Вот текст комментария из ЖЖ, который разъясняет принцип:<\/p>\n<blockquote>\n<p>Согласно описанию формата, сразу за заголовком («GIF89a») идет <i>Logical Screen Descriptor<\/i> (в котором как раз и прописан размер 80×80), затем <i>Global Color Table<\/i>, а уж за ним — всякие <i>Extensions<\/i> и данные изображений. В обсуждаемом файле <i>Global Color Table<\/i> просто отсутствует (так что <i>IE<\/i> ведет себя вполне адекватно). Зато присутствует картинка размером 100×100, которую и видят менее привередливые рендереры.<\/p>\n<\/blockquote>\n",
            "date_published": "2011-01-16T22:26:00+05:00",
            "date_modified": "2023-10-23T22:43:56+05:00",
            "tags": [
                "gif",
                "ie",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Sun, 16 Jan 2011 22:26:00 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "123692",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "130909",
            "url": "https:\/\/bolknote.ru\/all\/1436\/",
            "title": "Фокусы с GIF, прозрачность и hover",
            "content_html": "<style type=\"text\/css\">\na.link-2007-11-01-gun { border: 0 }\na.link-2007-11-01-gun:hover img { background: black }\na.link-2007-11-01-gun img { margin: 0px; border-right: 2px solid black; background: white }\n<\/style>\n<div style=\"float: left; width: 115px; height: 29px; margin: 10px\"><p><a href=\"#\" class=\"link-2007-11-01-gun\" align=\"left\"><img src=\"\/imgs\/2007.11.01.03.gif\" border=\"0\" width=\"115\" height=\"29\" alt=\"\" align=\"center\" \/><\/a><\/p>\n<\/div><p>Самые внимательные, наверное, заметили, что в прошлых заметках у меня на картинке использовалась эмуляция эффекта наведения на ссылку — посмотрите, если навести на картинку мышку, «ссылка», выделенная синим, на картинке подчеркнётся. И это не JavaScript.<\/p>\n<p>Объяснение очень простое — картинка сделана с прозрачностью, далее при помощи CSS под неё подставлен белый фон, а при наведении (селектор «:hover») фон меняется на голубой. Такой же эффект использован на картинке с пистолетом слева (наведите мышку). Ссылка на картинке обязательна — без неё в Internet Explorer (версии ниже 7-й) фон менять не будет, «:hover» просто не сработает. Таблица стилей для этой картинки выглядит вот так:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">a.gun:hover img { background: black } \/* стиль при наведении мышкой *\/\na.gun img { margin: 0px; background: white } \/* убираем поля в Opera и подкладываем белый фон *\/<\/code><\/pre><\/pre><p>HTML, соотвественно:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;a href=&quot;#&quot; class=&quot;gun&quot;&gt;&lt;img src=&quot;gun.gif&quot; \/&gt;&lt;\/a&gt;<\/code><\/pre><\/pre><p>Если вам не ясно, почему пистолетик «стреляет» (т. е. почему изображение движется, когда наводишь мышку), то тут всё просто — прозрачная область движется (это animated GIF), на белом фоне этого не видно, когда фон меняется, создаётся эффект движущейся пули.<\/p>\n<p>Ещё интересные эффекты можно получить, если использовать альфа-канал (полупрозрачность) в формате PNG, но, к сожалению, об анимации тут придётся забыть.<\/p>\n",
            "date_published": "2007-11-01T15:41:00+05:00",
            "date_modified": "2024-09-25T19:53:26+05:00",
            "tags": [
                "css",
                "gif",
                "html",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Thu, 01 Nov 2007 15:41:00 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "130909",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}