najmniejszy rozmiar pliku dla przezroczystego obrazu pojedynczego piksela

Szukam najmniejszego (pod względem rozmiaru pliku) przezroczystego 1 piksela obrazu.

Obecnie mam gif 49 bajtów, który wydaje się być najpopularniejszy.

Ale pamiętam, że wiele lat temu miałem taki, który miał mniej niż 40 bajtów. Mogło być 32 bajty.

Czy ktoś może stać się lepszy? Format graficzny nie jest problemem, o ile nowoczesne przeglądarki internetowe mogą go wyświetlać i szanować przejrzystość.

UPDATE: OK, znalazłem 42 bajtowy przezroczysty pojedynczy piksel gif: http://bignosebird.com/docs/h3.shtml

UPDATE2: wygląda na to, że coś mniej niż 43 bajty może być niestabilne w niektórych klientach. To niemożliwe.

Author: zaf, 2010-04-03

11 answers

Sprawdź to blank.gif pliku (43 bajty). Mniej niż 49: D

 17
Author: gmunkhbaatarmn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-08 16:57:15

Oto 32 bajtowy przezroczysty GIF, który (powinien) działać wszędzie

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

Wyjaśnienie

Osiągnięcie najmniejszego możliwego GIF zależy od implementacji używanej specyfikacji GIF. Przeglądarki internetowe są zwykle pobłażliwe, jeśli chodzi o dekodowanie plików GIF. Możesz znaleźć naprawdę mały GIF, który działa jako przezroczysty w jednej przeglądarce, ale biały/czarny w innej. I może nawet nie otworzyć się w oprogramowaniu takim jak Gimp, Paint i Photoshop.

Najmniejszy near-valid przezroczysty GIF to 32 bajty. "Prawie poprawne", bo trailer i część danych LZW można wyrzucić, a i tak będzie się otwierać w praktycznie każdym oprogramowaniu.

Odbywa się to zgodnie ze specyfikacją GIF , a każdy składnik można podzielić w następujący sposób:

  1. sygnatura pliku / wersja, 6 bajtów
  2. logiczny deskryptor ekranu, 7 bajtów
  3. opcjonalne: globalna tabela kolorów, 6 bajtów 1
  4. Opcjonalnie: rozszerzenie kontroli Grafiki , 8 bajtów
  5. deskryptor obrazu , 10 bajtów
  6. dane LZW , 1-4 bajty3
  7. Opcjonalnie: Przyczepa (0x3B), 1 byte⁴

1 globalną tabelę kolorów można bezpiecznie usunąć, wyłączając ją w logicznym deskryptorze ekranu
2 jest to wymagane dla przejrzystości w większości programów
3 wymagane są tylko 3 bajty danych LZW i bajty mogą być prawie dowolne. Choć tylko pierwszy bajt 0x02 jest ściśle wymagany.
⁴ Przyczepa może zostać usunięta bez złych skutków.

Większość programów GIF wymaga obecności globalnej / lokalnej tabeli kolorów. Dalsze redukcje (np. usuwanie globalnej tabeli kolorów) mogą działać w niektórych przeglądarkach, ale ich efekty są zwykle specyficzne dla implementacji. Edit: istnieje znacznik , który wyłącza globalną tabelę kolorów i nie powoduje żadnych problemów.

Inne Przykłady:

Na po 24 bajtach jest renderowany jako przezroczysty GIF w Chrome, jednak w Firefoksie jest nieprzezroczysty biały:

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=

następujące 14 bajtów działało tylko w Chrome, ale już nie:

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

data:image/gif;base64,R0lGODlhAQABAAAAACw=
 75
Author: bryc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-18 05:59:26

Oto czego używam w tablicy bajtów C #(unika się dostępu do plików)

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 };

W asp.net MVC this can be returned like this

return File(TrackingGif, "image/gif");
 25
Author: Jacob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-04 22:06:33

Aby rozszerzyć odpowiedź na tablicę bajtów Jacoba, wygenerowałem tablicę bajtów c# dla transparant 1x1 gif, który zrobiłem w Photoshopie.

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};
 17
Author: Michiel Cornille,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-13 10:54:37

Http://polpo.org/blank.gif jest 37-bajtowym przezroczystym gifem wykonanym za pomocą gifsicle.

W formacie CSS-ready base64:

data:image/gif;base64,R0lGODlhAQABAHAAACH5BAUAAAAALAAAAAABAAEAAAICRAEAOw==
 14
Author: polpo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-01 18:17:55
  • Zobacz: http://www.google-analytics.com/__utm.gif, 35B

  • Alternatywa w Perlu (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;
    
Uruchom go ...
$ perl tinygif > tiny.gif
$ ll tiny.gif
-rw-r--r--  1 stackoverflow  staff    45B Apr  3 10:21 tiny.gif
 7
Author: miku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-03 08:52:35

Przezroczysta kropka, 43 bajty:

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";

Pomarańczowa kropka, 35 bajtów:

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";

Bez tabeli kolorów (ewentualnie pomalowanej na czarno) , 26 bajtów:

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";

Pierwsze dwa znalazłem jakiś czas temu (w czasach timthumb) i nie pamiętam źródeł. Ostatni, który znalazłem tutaj .

P. S.: używaj do śledzenia, a nie jako podkładki dystansowe.

 4
Author: s3v3n,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-08 23:26:46

Myślę, że jest to najbardziej pamiętny 1x1 (38 bajtów):

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

Zgodnie ze specyfikacją nagłówka 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>

First %01%00 is width = 0x0001

Zauważ, że 1px jest %01%00 równa się 0x0001

Nie %00%01 w przeciwnym razie będzie to 0x0100

Druga to wysokość, taka sama jak wyżej

Następne 3 bajty możesz wprowadzić cokolwiek, przeglądarka może to przetworzyć

Np. /// lub !!! lub ,,, lub ;;; lub +++

Ostatni bajt musi być: ; , !

Przy okazji, jeśli użyjesz /// lub \\\ W 3 bajtach obok rozmiaru

Tytuł strony wyświetli ostatni znak, w przeciwnym razie wyświetli się gif,...

Testowane z Chrome, Firefox zarówno działa, IE nie działa

 1
Author: user3896501,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-08 17:02:28
 0
Author: Dested,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-03 08:16:58

Nie powinieneś używać "GIFów dystansowych". Były one używane w latach 90-tych; teraz są bardzo przestarzałe i nie mają żadnego celu, i powodują kilka problemów z dostępnością i kompatybilnością.

Użyj CSS.

 0
Author: Andreas Bonini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-03 08:39:10

Pamiętam, że kiedyś, dawno temu, próbowałem stworzyć jak najmniejszy gif. Jeśli postępujesz zgodnie ze standardem, o ile dobrze pamiętam, rozmiar to 32 bajty. Ale możesz "zhakować" specyfikację i mieć 26-28 bajtów, które będą widoczne w większości przeglądarek. Ten GIF nie jest do końca "poprawny", ale działa, czasami. Wystarczy użyć specyfikacji nagłówka GIF i edytora szesnastkowego.

 0
Author: Ross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-02 23:21:17