Минимальный размер файла для прозрачного одиночного пикселя

Я ищу самый маленький (с точки зрения размерности) прозрачный 1 пиксельный образ.

В настоящее время у меня есть gif из 49 байтов, который кажется самым популярным.

Но я помню много лет назад, имея менее 40 байт. Может быть 32 байта.

Кто-нибудь может сделать лучше? Графический формат не вызывает беспокойства, если современные веб-браузеры могут отображать его и уважать прозрачность.

ОБНОВЛЕНИЕ: Я нашел 42-байтный прозрачный один пиксель gif: http://bignosebird.com/docs/h3.shtml

UPDATE2. Похоже, что на некоторых клиентах может быть нестабильно менее 43 байт. Не может быть этого.

Ответ 1

Оформить заказ blank.gif файл (43 байта). Менее 49: D

Ответ 2

Вот 32-байтовый прозрачный GIF, который (должен) работать везде

data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEAAAAALAAAAAABAAEAAAI=

47 49 46 38 39 61 01 00 01 00 00 00 00 21 F9 04
01 00 00 00 00 2C 00 00 00 00 01 00 01 00 00 02

Описание

Достижение наименьшего возможного GIF зависит от реализации используемой спецификации GIF. Веб-браузеры обычно снисходительны, когда речь идет о декодировании GIF файлов. Вы можете найти действительно маленький GIF, который работает как прозрачный в одном браузере, но белый/черный в другом. И это может даже не открыться в таких программах, как Gimp, Paint и Photoshop.

Самый маленький почти допустимый прозрачный GIF - 32 байта. "Near-valid", потому что трейлер и некоторые данные LZW могут быть отброшены и будут работать практически во всех программах.

Это делается с помощью спецификации GIF, и каждый компонент можно разбить следующим образом:

  • Файловая подпись/версия, 6 байт
  • Дескриптор логического экрана, 7 байт
  • Дополнительно: глобальная таблица цветов, 6 байтов и sup1;
  • Дополнительно: расширение графического управления, 8 байтов и sup2;
  • Дескриптор изображения, 10 байт
  • Данные LZW, 1-4 байта и sup3;
  • Дополнительно: трейлер (0x3B), 1 байт⁴

& ПОД1; Глобальную таблицу цветов можно удалить безопасно, отключив ее в Логический дескриптор экрана
& Sup2; Это необходимо для прозрачности в большинстве программных продуктов & Sup3; Требуются только 3 байта данных LZW, и байты могут быть почти любыми. Хотя строго требуется только первый байт 0x02.
⁴ Трейлер можно удалить без вредных последствий.

В большинстве программ GIF требуется наличие глобальной/локальной таблицы цветов. Дальнейшие сокращения (например, удаление Глобальной таблицы цветов) могут работать в некоторых браузерах, но их эффекты обычно зависят от реализации. Изменить: есть флаг чтобы отключить глобальную таблицу цветов, и это, похоже, не вызывает никаких проблем.

Другие примеры:

Следующие 23 байта отображаются как прозрачный GIF в Chrome, однако в Firefox он непрозрачен:

47 49 46 38 39 61 01 00 01 00 00 00 00 2C 00 00 00 00 01 00 01 00 00 02

data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=

Следующие 14 байтов используются только в Chrome, но не более:

47 49 46 38 39 61 01 00 01 00 00 00 00 2C

data:image/gif;base64,R0lGODlhAQABAAAAACw=

Ответ 3

Вот что я использую в массиве байтов С# (избегает доступа к файлам)

static readonly byte[] TrackingGif = { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x1, 0x0, 0x1, 0x0, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x2, 0x2, 0x44, 0x1, 0x0, 0x3b };

В asp.net MVC это можно вернуть как

return File(TrackingGif, "image/gif");

Ответ 4

Чтобы расширить ответ на массив байтов Jacob, я сгенерировал массив байтов С# для прозрачного 1x1 gif, который я сделал в фотошопе.

static readonly byte[] TrackingGif = { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x01, 0x00, 0x01, 0x00, 0x81, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff, 0x0b, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x50, 0x45, 0x32, 0x2e, 0x30, 0x03, 0x01, 0x01, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x08, 0x04, 0x00, 0x01, 0x04, 0x04, 0x00, 0x3b};

Ответ 5

http://polpo.org/blank.gif - это прозрачный GIF файл размером в 37 байт, созданный с помощью gifsicle.

В css-готовом формате base64:

data:image/gif;base64,R0lGODlhAQABAHAAACH5BAUAAAAALAAAAAABAAEAAAICRAEAOw==

Ответ 6

  • Смотрите: http://www.google-analytics.com/__utm.gif, 35B

  • Альтернатива в Perl (45B):

    ## tinygif
    ## World Smallest Gif
    ## 35 bytes, 43 if transparent
    ## Credit: http://www.perlmonks.org/?node_id=7974
    
    use strict;
    my($RED,$GREEN,$BLUE,$GHOST,$CGI);
    
    ## Adjust the colors here, from 0-255
    $RED   = 255;
    $GREEN = 0;
    $BLUE  = 0;
    
    ## Set $GHOST to 1 for a transparent gif, 0 for normal
    $GHOST = 1;
    
    ## Set $CGI to 1 if writing to a web browser, 0 if not
    $CGI = 0;
    
    $CGI && printf "Content-Length: %d\nContent-Type: image/gif\n\n", 
        $GHOST?43:35;
    printf "GIF89a\1\0\1\0%c\0\0%c%c%c\0\0\0%s,\0\0\0\0\1\0\1\0\0%c%c%c\1\
        +0;",
        144,$RED,$GREEN,$BLUE,$GHOST?pack("c8",33,249,4,5,16,0,0,0):"",2,2,4
    +0;
    

Запустите его...

$ perl tinygif > tiny.gif
$ ll tiny.gif
-rw-r--r--  1 stackoverflow  staff    45B Apr  3 10:21 tiny.gif

Ответ 7

Прозрачная точка, 43 байта:

echo "\x47\x49\x46\x38\x39\x61\x1\x0\x1\x0\x80\x0\x0\xff\xff\xff\xff\xff";
echo "\xff\x21\xf9\x04\x1\x0a\x0\x1\x0\x2c\x0\x0\x0\x0\x1\x0\x1\x0";
echo "\x0\x2\x2\x4c\x1\x0\x3b";

Оранжевая точка, 35 байт:

echo "\x47\x49\x46\x38\x37\x61\x1\x0\x1\x0\x80\x0\x0\xfc\x6a\x6c\x0";
echo "\x0\x0\x2c\x0\x0\x0\x0\x1\x0\x1\x0\x0\x2\x2\x44\x1\x0\x3b";

Без таблицы цветов (возможно, окрашенной как черный), 26 байт:

echo "\x47\x49\x46\x38\x39\x61\x1\x0\x1\x0\x0\xFF";
echo "\x0\x2C\x0\x0\x0\x0\x1\x0\x1\x0\x0\x2\x0\x3B";

Первые два, которые я нашел некоторое время назад (во времена уязвимости timthumb), и я не помню источники. Последнее, что я нашел здесь.

P.S.: Используйте для отслеживания, а не как проставки.

Ответ 8

Я думаю, что это самый запоминающийся 1x1 (38 байт):

data:image/gif,GIF89a%01%00%01%00///;

В соответствии со спецификацией заголовка GIF:

GIF Header

Offset   Length   Contents
  0      3 bytes  "GIF"
  3      3 bytes  "87a" or "89a"
  6      2 bytes  <Logical Screen Width>
  8      2 bytes  <Logical Screen Height>

Первая %01%00 - width = 0x0001

отметим, что 1px %01%00 равно 0x0001

not %00%01 в противном случае это будет 0x0100

Вторая - высота, такая же, как указано выше

Следующие 3 байта вы можете вводить что угодно, браузер может анализировать его

например. /// или !!! или ,,, или ;;; или +++

последний байт должен быть: ; , !

кстати, если вы используете /// или \\\ в 3 байтах рядом с размером

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

протестирован с Chrome, Firefox работал, IE не работает

Ответ 10

Вы не должны использовать "spacer gifs". Они использовались в 90-х годах; теперь они очень устарели, и у них нет никакой цели, и они вызывают несколько проблем доступности и совместимости.

Используйте CSS.

Ответ 11

Я помню однажды, давным-давно, я попытался создать самый маленький gif. Если вы следуете стандарту, если я правильно помню, размер составляет 32 байта. Но вы можете "взломать" спецификацию и иметь 26-28 байт, что будет отображаться в большинстве браузеров. Этот GIF не совсем "правильный", но работает, когда-то. Просто используйте спецификацию заголовка GIF и редактор HEX.