我正在寻找最小的(文件大小方面)透明的1像素图片。
目前我有一个大小为49字节的gif,似乎是最流行的。
但我记得许多年前有一个少于40字节的图片。可能是32字节。
有人能做得更好吗?图形格式无所谓,只要现代Web浏览器可以显示它并支持透明度即可。
更新: 好的,我已经找到了一个42字节的透明单像素gif: http://bignosebird.com/docs/h3.shtml
更新2: 看来少于43字节的可能在某些客户端中不稳定。不能这样。
我正在寻找最小的(文件大小方面)透明的1像素图片。
目前我有一个大小为49字节的gif,似乎是最流行的。
但我记得许多年前有一个少于40字节的图片。可能是32字节。
有人能做得更好吗?图形格式无所谓,只要现代Web浏览器可以显示它并支持透明度即可。
更新: 好的,我已经找到了一个42字节的透明单像素gif: http://bignosebird.com/docs/h3.shtml
更新2: 看来少于43字节的可能在某些客户端中不稳定。不能这样。
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规范的不同实现,这甚至会随着时间的推移而改变。网络浏览器通常对GIF渲染宽容和不一致,允许部分损坏的GIF显示。在回答的历史中,我曾制作过一个14字节的GIF,只有在Chrome中才是透明的,但现在已经不起作用了。有一个23字节的版本可以在Chrome和Firefox中使用,但最终在Firefox中不再透明。我选择了一个32字节的版本,认为它可以在任何地方使用,但后来发现它在Safari 14中无法使用。即使是一个修复了Safari 14的33字节版本,在Safari 15中也停止工作了!因此,显然最好遵循标准,不要依赖可能永远不起作用的hacky解决方案。虽然我还应该提到,自1996年以来,间隔GIF已经不再相关,您真的不应该使用它们。请改用CSS。我写这篇答案只是为了更多地了解GIF。
如果我们遵循官方GIF规范,我们得出的数字是43字节,由以下部分组成:
0x3B
),1个字节这些中有些技术上是可选的。例如,尾随符号可以被安全地省略,并且不会影响图像的渲染。LZW数据可以通过将子块计数更改为1而不是2来减少到4个字节。这样就得到了上面的41个字节的GIF。然后我们可以通过关闭位标志来安全地禁用全局颜色表,在每个浏览器中都可以安全地使用,但可能会使无能的GIF解析器困惑。这样就得到了上面的35个字节。
这是我在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");
看看这个 blank.gif
文件(43字节)。小于49 :D
为了进一步解释Jacob的字节数组答案,我生成了一个c#字节数组,用于一个我在Photoshop中制作的透明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};
http://polpo.org/blank.gif是一个由gifsicle制作的37字节透明GIF。
以CSS就绪的base64格式:
data:image/gif;base64,R0lGODlhAQABAHAAACH5BAUAAAAALAAAAAABAAEAAAICRAEAOw==
Alternative in 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
透明点,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";
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.: 仅用于追踪目的,不要用作间隔符。
我认为这是最令人难忘的 1x1(38字节):
data:image/gif,GIF89a%01%00%01%00///;
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
,而不是 %00%01
,否则会变成 0x0100
其次是高度,与上面相同
接下来的三个字节可以输入任何内容,浏览器可以解析它们
例如:///
、!!!
、,,,
、;;;
或者 +++
最后一个字节必须是:;
、,
或者 !
顺便说一下,如果在尺寸后面的三个字节中使用 ///
或者 \\\
页面标题将显示最后一个字符,否则将显示 gif,...
在 Chrome 和 Firefox 上测试通过,IE 不支持
http://www.maproom.co.uk/0.gif 是43个字节,稍微压缩了一点。
你不应该使用“空白gif”。它们在90年代被使用过,现在已经非常过时了,而且它们没有任何作用,会导致多种无障碍性和兼容性问题。
使用CSS。