透明单像素图像的最小文件大小

时间:2010-04-03 08:13:58

标签: image graphics transparency filesize

我正在寻找最小的(在文件大小方面)透明的1像素图像。

目前我有一个49字节的gif,这似乎是最受欢迎的。

但我记得很多年前有一个不到40个字节。可能是32个字节。

任何人都可以做得更好吗?只要现代Web浏览器可以显示图形格式并尊重透明度,图形格式就不用担心了。

更新:好的,我找到了一个42字节的透明单像素gif: http://bignosebird.com/docs/h3.shtml

UPDATE2 :看起来在某些客户端中,少于43个字节的内容可能不稳定。不能有那个。

11 个答案:

答案 0 :(得分:80)

这是32 byte transparent 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文件时,Web浏览器通常很宽松。您可能会发现一个非常小的GIF,在一个浏览器中可以透明,而在另一个浏览器中则是白色/黑色。它甚至可能不会在像Gimp,Paint和Photoshop这样的软件中打开。

最小的接近有效的透明GIF是32个字节。 “接近有效”,因为预告片和一些LZW数据可以丢弃,并且几乎所有软件仍然会打开。

这是通过遵循GIF spec来完成的,每个组件都可以按如下方式细分:

  1. 文件签名/版本,6个字节
  2. 逻辑屏幕描述符,7个字节
  3. 可选:全局颜色表,6字节¹
  4. 可选:图形控制扩展,8字节²
  5. 图像描述符,10个字节
  6. LZW数据,1-4字节3
  7. 可选:预告片0x3B),1字节⁴
  8. ¹全局颜色表可以通过在Logical Screen Descriptor中禁用全局颜色表来安全删除 ²这是大多数软件透明度所必需的 ³只需要3个字节的LZW数据,字节几乎可以是任何字节。虽然只有0x02的第一个字节是严格要求的 ⁴可以移除拖车而不会产生不良影响。

    大多数GIF软件都需要全局/本地颜色表。进一步减少(例如删除全局颜色表)可能在某些浏览器中有效,但它们的效果通常是特定于实现的。 编辑:有一个flag来禁用全局颜色表,它似乎不会导致任何问题。

    其他例子:

    以下24个字节在Chrome中呈现为透明GIF,但在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=
    

答案 1 :(得分:26)

这是我在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");

答案 2 :(得分:20)

签出此blank.gif文件(43个字节)。少于49:D

答案 3 :(得分:18)

为了扩展雅各布的字节数组答案,我为我在photoshop中制作的 transparant 1x1 gif生成了c#字节数组。

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

答案 4 :(得分:14)

http://polpo.org/blank.gif是一个用gifsicle制作的37字节透明GIF。

以css-ready base64格式:

data:image/gif;base64,R0lGODlhAQABAHAAACH5BAUAAAAALAAAAAABAAEAAAICRAEAOw==

答案 5 :(得分:7)

  • 请参阅: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

答案 6 :(得分:4)

透明点,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漏洞的时代),我不记得消息来源。我找到的最新版here

P.S。:用于追踪目的,而非隔离物。

答案 7 :(得分:1)

我认为这是最令人难忘的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

不是%00%01否则它将是0x0100

第二是身高,与上述相同

接下来3个字节你可以输入任何内容,浏览器可以解析它

e.g。 ///!!!,,,;;;+++

最后一个字节必须是:; , !

顺便提一下,如果你在大小旁边的3个字节处使用///\\\

页面标题将显示最后一个字符,否则将显示gif,...

用Chrome测试过,Firefox都工作过,IE无法正常工作

答案 8 :(得分:0)

http://www.maproom.co.uk/0.gif是43个字节,刮一点。

答案 9 :(得分:0)

你不应该真的使用“spacer gifs”。他们在90年代使用;现在它们已经过时了,它们没有任何目的,它们会导致一些可访问性和兼容性问题。

使用CSS。

答案 10 :(得分:0)

我记得有一次,很久以前,我试图创造出最小的GIF。如果你遵循标准,如果我没记错的话,大小是32字节。但是你可以“破解”规范并拥有26-28字节,这将在大多数浏览器中显示。这个GIF并不完全“正确”,但有时会起作用。只需使用GIF标头规范和HEX编辑器。