наименьший размер файла для прозрачного однопиксельного изображения - PullRequest
62 голосов
/ 03 апреля 2010

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

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

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

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

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

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

Ответы [ 11 ]

81 голосов
/ 12 апреля 2013

Вот прозрачный 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 байта. «Почти достоверный», потому что трейлер и некоторые данные LZW могут быть отброшены, и он все равно будет открыт практически во всех программах.

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

  1. Подпись / версия файла, 6 байтов
  2. Дескриптор логического экрана , 7 байтов
  3. Необязательно: Глобальная таблица цветов , 6 байтов & sup1;
  4. Необязательно: Расширение графического управления , 8 байтов & sup2;
  5. Дескриптор изображения , 10 байтов
  6. LZW Data , 1-4 байта & sup3;
  7. Дополнительно: Трейлер (0x3B), 1 байт⁴

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

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

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

Следующие 24 байта отображаются как прозрачный 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=
26 голосов
/ 05 июня 2010

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

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");
20 голосов
/ 03 апреля 2010

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

18 голосов
/ 13 декабря 2011

Чтобы расширить ответ байтового массива Джейкоба, я сгенерировал байтовый массив c # для transparant 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};
14 голосов
/ 01 февраля 2013

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

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

data:image/gif;base64,R0lGODlhAQABAHAAACH5BAUAAAAALAAAAAABAAEAAAICRAEAOw==
7 голосов
/ 03 апреля 2010
  • См .: http://www.google -analytics.com / __ utm.gif , 35B

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

    ## tinygif
    ## World's 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
4 голосов
/ 09 декабря 2012

Прозрачная точка, 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 .: Используется для целей отслеживания, а не в качестве прокладок.

1 голос
/ 04 мая 2015

Я думаю, что это самый запоминающийся 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 это ширина = 0x0001

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

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

Второй - высота, такая же, как выше

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

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

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

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

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

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

0 голосов
/ 05 апреля 2010

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

0 голосов
/ 03 апреля 2010

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

Использовать CSS.

...