浏览器如何检测GIF图像大小?

时间:2011-07-25 20:29:32

标签: html image http browser imagemagick

我注意到在FireFox 5和IE 8中使用填充显示了GIF。当我通过FireBug查看图像大小时,我注意到它比预期的大几个像素。

  

预期身高:160px vs.实际身高:171px

当我在图像编辑器中打开GIF时,编辑器显示了正确的尺寸,但是当我运行ImageMagick识别时,我收到了以下信息:

newGif.gif GIF 200x160 200x171+0+5 PseudoClass 256c 30kb 

如果我将几何图形修改为200x160 + 0 + 0,则图像显示为我在FireFox中预期的图像。 FireFox和IE 8似乎引用了Image的页面几何而不是尺寸!我的分析是否正确,如果是这样,对所有图像类型或GIF都是如此?

  

更新后,我收录了一张图片供您观赏!这个图像在FF中显示为200 x 171,但在图形程序中下载和查看时实际上是200 x 160。

here is the image

3 个答案:

答案 0 :(得分:7)

此GIF文件的标题与其正文不对应。 enter image description here

图像尺寸存储在第6到第9个字节中,从屏幕截图中可以看到标题中的尺寸为00C8 x 00AB,即200x171,但实际尺寸为200x160

因此此图片无效。解析无效的GIF没有标准化的行为,这就是为什么会出现这种不一致的原因。

很可能firefox会在完全下载之前为图像预分配图像,当图像完全下载后,它会被放入预分配空间的中心。并且由于预分配空间为200x171,但实际图像为200x160,您将看到边框。

编辑:在浏览GIF格式参考后,看起来GIF确实允许这样做。所以图像是有效的。所以这里是实际发生的事情: GIF格式由几个块组成。有一个标题块和一个或多个(,如果图像是动画的)图像块(也可能有其他块,但它们没有连接问题) 。标题块包含有关图像的一些信息,包括它的宽度和高度。但是每个图像块也有自己的宽度和高度。那么对于所讨论的图像会发生什么呢?它的主图像尺寸为200x171,而单帧尺寸为200x160。因此,大多数不支持GIF动画的编辑程序和库将提取第一帧并以200x160的大小显示它,支持动画的浏览器和编辑器应以200x171的全尺寸显示它。

PS 每个图像块都有图像顶部和图像左侧位置。似乎通过允许帧比画布小,并允许在画布上移动帧的位置,GIF的开发人员试图削减动画gif文件的几个字节。我想知道是否有任何现代图形编辑器利用这一点...可能不是...... :)。

  1. GIF format byte order

答案 1 :(得分:0)

我怀疑GIF是一种动画格式,因此它可能包含位于几何框架不同位置的多个图像。因此,浏览器应该为整个事情预留位置。

答案 2 :(得分:0)

如果您保存图片,并右键单击>属性,它会说明它是200x160,当您在Windows中预览图片时也会注意到黑色条被添加到图像中,这很奇怪。如果你用ms画画打开它(仅用于演示目的),你会注意到图像用黑条填充,当你查看文件 - >属性时,它表示图像现在是200x171。

最可能的情况是文件标题表示它是200x160(窗口/浏览器等会快速告诉您图像大小),而实际图像块是200x171。黑色条不会显示在浏览器中,因为它们可能是透明的,但由于ms画图和窗口预览不支持透明度,黑条显示在其中。此外,在mspaint中找到正确的大小,因为标题数据被抛出,并且属性显示其数据结构的属性,现在将图像块保存到图像编辑,类似地,如果您将图像加载到mspaint,修改图像以删除黑条,保存,然后将该图片放入浏览器,然后填充将消失。

大多数情况下,在加载图像文件的图像时,只需要图像的水平分辨率,并且只读取图像的每个垂直行的水平分辨率的图像块。对于图像块,您处于图像的末尾,因此不需要注意垂直分辨率来加载图像。这就是图像看起来正常,并且不会从底部边缘裁剪的原因。

至于为什么这个图像没有在其他浏览器中填充。我只能假设这个带有边界的填充图像是他们在图像文件中所期望的各种标准,并且当遇到大于文件头指定的图像块时,它们将其朝向图像块的中心裁剪为最好的能力