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

我正在寻找最小(根据文件大小)透明的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规范来完成的,每个组件可以细分如下:

  1. 文件签名/版本,6个字节
  2. 逻辑屏幕描述符 ,7个字节
  3. 可选: 全局颜色表 ,6个字节¹
  4. 可选: graphics控制扩展 ,8字节²
  5. 图像描述符 ,10个字节
  6. LZW数据 ,1-4字节³
  7. 可选: 预告片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编辑器。