67

我正在寻找最小(就文件大小而言)透明 1 像素图像。

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

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

谁能做得更好?只要现代网络浏览器可以显示它并尊重透明度,图形格式就不是问题。

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

UPDATE2:在某些客户端中,看起来小于 43 字节的任何内容都可能不稳定。不能这样。

4

11 回答 11

91

最小的有效透明 GIF 为 35 字节。

data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEAAAAALAAAAAABAAEAAAIBAAA=

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 01 00 00

这应该适用于每个新旧浏览器,以及基本上任何图像编辑器/查看器。但是,它可能不适用于弱 GIF 解析器,例如 PHP 图像库中的解析器。

如果您需要它绝对万无一失,那么最小值是 41 个字节:

data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAAAAAAALAAAAAABAAEAAAIBAAA=

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

这是解释。

可能的最小 GIF 在 GIF 规范的不同实现之间可能会有所不同,甚至会随着时间的推移而变化。Web 浏览器通常对 GIF 渲染很宽松且不一致,允许显示部分损坏的 GIF。在这个答案的整个历史中,我制作了一个仅在 Chrome 中透明的 14 字节 GIF,但这不再有效。有一个 23 字节的版本可以在 Chrome 和 Firefox 中使用,但最终在 Firefox 中不再透明。我选择了一个我认为在任何地方都可以使用的 32 字节版本,但后来发现它在 Safari 14 中不起作用。即使是修复了 Safari 14 的 33 字节版本在 Safari 15 中也停止了工作!因此,显然最好遵循标准,而不是依赖可能无法永远工作的 hacky 解决方案。虽然我还应该提到,间隔 GIF 自 1996 年以来就不再相关,你真的不应该使用它们。改用 CSS。我刚刚写了这个答案来了解更多关于 GIF 的信息。

如果我们按照官方的 GIF 规范,我们会得出一个 43 字节的图形,由以下部分组成:

  1. 文件签名,6字节
  2. 逻辑屏幕描述符,7字节
  3. 全局颜色表,6字节
  4. 图形控制扩展,8字节
  5. 图像描述符,10字节
  6. 压缩的 LZW 图像数据,5 字节
  7. 拖尾0x3B),1 字节

其中一些在技术上是可选的。例如,可以安全地省略 Trailer 字节,并且不会阻止图像被渲染。通过将子块计数更改为 1而不是 2 ,可以将 LZW 数据减少到 4 个字节。这让我们看到了上面的 41 字节 GIF。然后,我们可以通过关闭一个位标志来安全地禁用全局颜色表,这在每个浏览器中都可以安全地工作,但可能会混淆无能的 GIF 解析器。这让我们得到了上面的 35 字节。

于 2013-04-11T23:58:56.243 回答
30

这是我在 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");
于 2010-06-04T22:06:33.627 回答
20

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

于 2010-04-03T08:21:10.970 回答
19

为了扩展 Jacob 的字节数组答案,我为我在 Photoshop 中制作的透明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};
于 2011-12-13T10:54:37.290 回答
15

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

在 css-ready base64 格式中:

data:image/gif;base64,R0lGODlhAQABAHAAACH5BAUAAAAALAAAAAABAAEAAAICRAEAOw==
于 2013-02-01T18:17:55.210 回答
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
于 2010-04-03T08:24:51.230 回答
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 漏洞时期),我不记得来源了。我在这里找到的最新的。

PS:用于跟踪目的,不作为垫片。

于 2012-12-08T23:26:46.997 回答
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是宽度 = 0x0001

注意 1px%01%00等于 0x0001

否则%00%01它将是 0x0100

第二个是高度,同上

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

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

last one byte must be: ; , !

by the way, if you use /// or \\\ at the 3 bytes next to size

page title will display last character, otherwise will show gif,...

tested with Chrome, Firefox both worked, IE does not works

于 2015-05-04T10:04:07.027 回答
0

http://www.maproom.co.uk/0.gif是 43 字节,有点刮胡子。

于 2010-04-03T08:16:58.007 回答
0

您不应该真正使用“间隔 gif”。它们在 90 年代被使用;现在它们已经非常过时并且没有任何用途,并且会导致一些可访问性和兼容性问题。

使用 CSS。

于 2010-04-03T08:27:38.027 回答
0

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

于 2010-04-05T08:41:56.477 回答