我正在寻找最小(就文件大小而言)透明 1 像素图像。
目前我有一个 49 字节的 gif,这似乎是最受欢迎的。
但我记得很多年前有一个不到 40 字节。可能是 32 个字节。
谁能做得更好?只要现代网络浏览器可以显示它并尊重透明度,图形格式就不是问题。
更新:好的,我找到了一个 42 字节的透明单像素 gif: http ://bignosebird.com/docs/h3.shtml
UPDATE2:在某些客户端中,看起来小于 43 字节的任何内容都可能不稳定。不能这样。
我正在寻找最小(就文件大小而言)透明 1 像素图像。
目前我有一个 49 字节的 gif,这似乎是最受欢迎的。
但我记得很多年前有一个不到 40 字节。可能是 32 个字节。
谁能做得更好?只要现代网络浏览器可以显示它并尊重透明度,图形格式就不是问题。
更新:好的,我找到了一个 42 字节的透明单像素 gif: http ://bignosebird.com/docs/h3.shtml
UPDATE2:在某些客户端中,看起来小于 43 字节的任何内容都可能不稳定。不能这样。
最小的有效透明 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 字节的图形,由以下部分组成:
0x3B
),1 字节其中一些在技术上是可选的。例如,可以安全地省略 Trailer 字节,并且不会阻止图像被渲染。通过将子块计数更改为 1而不是 2 ,可以将 LZW 数据减少到 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 的字节数组答案,我为我在 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};
http://polpo.org/blank.gif是用 gifsicle 制作的 37 字节透明 GIF。
在 css-ready base64 格式中:
data:image/gif;base64,R0lGODlhAQABAHAAACH5BAUAAAAALAAAAAABAAEAAAICRAEAOw==
参见: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
透明点,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:用于跟踪目的,不作为垫片。
我认为这是最令人难忘的 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
http://www.maproom.co.uk/0.gif是 43 字节,有点刮胡子。
您不应该真正使用“间隔 gif”。它们在 90 年代被使用;现在它们已经非常过时并且没有任何用途,并且会导致一些可访问性和兼容性问题。
使用 CSS。
我记得有一次,很久以前,我试图创建最小的 gif。如果你按照标准,如果我没记错的话,大小是 32 字节。但是您可以“破解”规范并拥有 26-28 字节,这将在大多数浏览器中显示。这个 GIF 并不完全“正确”,但有时会起作用。只需使用 GIF 标头规范和 HEX 编辑器。