我正在使用带有背景图像的透明1x1图像,以便能够使用精灵并仍为某些图标提供替代文本。
我想为图像使用数据URI来减少HTTP请求的数量,但是产生透明图像的最小字符串是什么?
我意识到我可以使用数据URI:s代替实际的图片,但是当所有内容都保存在CSS中而不是分散放置时,维护起来会更容易。
我正在使用带有背景图像的透明1x1图像,以便能够使用精灵并仍为某些图标提供替代文本。
我想为图像使用数据URI来减少HTTP请求的数量,但是产生透明图像的最小字符串是什么?
我意识到我可以使用数据URI:s代替实际的图片,但是当所有内容都保存在CSS中而不是分散放置时,维护起来会更容易。
Answers:
在使用不同的透明GIF玩耍后,有些不稳定并会导致CSS故障。例如,如果您有一个,<img>
并且使用了可能的最小透明GIF,则它可以正常工作,但是,如果您随后希望透明GIF具有一个background-image
,则这是不可能的。由于某些原因,某些GIF(例如以下代码)会阻止CSS背景(在某些浏览器中)。
较短(但不稳定-74字节)
data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
我建议使用稍长且更稳定的版本,如下所示:
data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
作为另一提示,不要忽略image/gif
一个评论所建议的内容。这将在多个浏览器中中断。
data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'/%3E
最终长度取决于所压缩的内容。
width: auto;
,SVG会占据其父级的宽度。静态图像(例如GIF或PNG)在设置为固定的高度和宽度自动值时,将保留其宽高比。
我认为它必须是压缩的透明1x1 GIF文件(82字节):
data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==
最小的PNG-114字节:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=
这个家伙通过GIF规范解决了这个问题。他的解决方案transparent.gif
是37个字节:
data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
首先删除透明度,然后删除颜色表,他变得更小。
标头(6个字节)
由字节“ GIF”和版本号组成,通常为
89a
。
逻辑屏幕描述符(7个字节)
无需赘述,文件的此部分指示以下内容:
- 该文件的大小为1x1像素。
- 有一个全局色表。
- 全局颜色表中有2种颜色,第二种颜色应用作背景颜色。
全局颜色表(6个字节)
每种颜色包含3个字节,红色,绿色和蓝色分别包含一个字节。在我们的文件中,第一种颜色是白色,第二种颜色是黑色。
图形控件扩展(8字节)
用于指示应将颜色表中的第二种颜色视为透明(也可以用于动画参数,但不在此文件中)。
图像描述符(10字节)
一个GIF文件实际上可以在其中包含多个“图像”,这使您不必为与背景色相同颜色的图像部分指定图像数据。每个图像块在整个图像尺寸内具有位置和尺寸。在上面的文件中,位置为0,0,大小为1x1。
图像数据(5字节)
一个LZW编码的图像数据块。它需要5个字节来表示图像中的单个像素。压缩算法的设计并不是很好地压缩单个字节。
GIF预告片(1个字节)
十六进制值为
3B
(;
ASCII)的单个字节表示GIF的结尾。
根据透明GIF所需的结构,事实证明43字节几乎可以得到。
但是,我设法找出了一个使它变小的方法。标准中提到拥有全局色表是可选的。当然,当您制作完全没有颜色表的GIF时会发生什么还没有定义。
但是,当将颜色表索引定义为透明时,GIF解码器似乎并不关心实际上没有颜色表。
因此,我更改了逻辑屏幕描述符以指示没有全局颜色表,并删除了该表本身,总共节省了六个字节,使文件大小减小到只有37个字节。
有趣的是,尽管Firefox和GIMP都打开并显示(透明时“显示”?),但Wordpress给了我一则可爱的GD错误消息清单,抱怨这不是有效的GIF文件。正好。
为了使其更小,我查看了图像中最大的剩余“可选”块,即图形控件扩展。如果您不需要透明度,则不再需要此块,而这又是8字节,您可以删除。
资料来源:有史以来最细的GIF。
这是我发现的最小字节(26个字节):
data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=
我正在使用以下数据uri获取空图像: //:0
对于空图像:
data:null
(它将转换为src=(unknown)
)