透明单像素图像的最小文件大小
我正在寻找最小(根据文件大小)透明的1像素图像。
目前我有一个49字节的GIF似乎是最stream行的。
但是我记得很多年前有一个小于40字节的文件。 可能是32个字节。
谁能做得更好? 只要现代的网页浏览器能够显示它并尊重透明度,graphics格式就不成问题了。
更新 :好的,我find了一个42字节的透明单像素gif: http : //bignosebird.com/docs/h3.shtml
UPDATE2 :看起来像小于43字节的东西在某些客户端可能不稳定。 不能有这个。
检出这个blank.gif
文件(43字节)。 小于49:D
这是一个32字节的透明 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规范来完成的,每个组件可以细分如下:
- 文件签名/版本,6个字节
- 逻辑屏幕描述符 ,7个字节
- 可选: 全局颜色表 ,6个字节¹
- 可选: graphics控制扩展 ,8字节²
- 图像描述符 ,10个字节
- LZW数据 ,1-4字节³
- 可选: 预告片 (
0x3B
),1字节4
¹通过在逻辑屏幕描述符中禁用全局颜色表,可以安全地移除全局颜色表
²在大多数软件中,这是透明的要求
³只需要3个字节的LZW数据,字节几乎可以是任何东西。 虽然只有0x02
的第一个字节是严格要求的。
Tra拖车可以删除没有不良影响。
大多数GIF软件都需要全局/本地颜色表。 进一步的减less(例如删除全局颜色表)可能在某些浏览器中有效,但是它们的效果通常是特定于实现的。 编辑:有一个标志来禁用全球颜色表,它似乎不会导致任何问题。
其他例子:
以下23个字节在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=
这是我在一个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");
为了扩展雅各布的字节数组答案,我生成了一个透明的 1×1 gif我在Photoshop中制作的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漏洞的时代),我不记得来源。 我在这里find的最新的一个。
PS:用于追踪目的,而不是间隔。
我认为这是最难忘的1×1(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个字节你可以input任何东西,浏览器可以parsing它
例如///
或!!!
或者,,,
或;;;
或+++
最后一个字节必须是: ,
!
顺便说一下,如果您在大小旁边的3个字节处使用///
或\\\
页面标题将显示最后一个字符,否则将显示gif,...
用Chrome,Firefox都testing过,IE不工作
你不应该使用“spacer gif”。 他们在90年代被使用。 现在它们已经非常过时了,它们没有任何目的,而且造成了一些可访问性和兼容性问题。
使用CSS。
我记得有一次,很久以前,我试图创造可能的最小gif。 如果你遵循标准,如果我没有记错,大小是32字节。 但是,你可以“破解”规范,并有一个26-28字节,这将在大多数浏览器中显示。 这个GIF不是完全“正确的”,而是有时候工作。 只需使用GIF标头规格和HEX编辑器。