用Imagemagick的convert命令发现了一个好玩的事情:

identify a.png
convert -extract 200x200+100+100 a.png a.jpg
identify a.jpg
convert -extract 200x200+100+100 a.png a.gif
identify a.gif

给出结果是:

a.png PNG 640x480 640x480+0+0 8-bit PseudoClass 16c 1.12KB 0.000u 0:00.000
a.jpg JPEG 200x200 200x200+0+0 8-bit PseudoClass 256c 7.77KB 0.000u 0:00.000
a.gif GIF 200x200 640x480+100+100 8-bit PseudoClass 16c 1.79KB 0.000u 0:00.000

就是说从一个640x480的png中裁一块200x200的图像下来,存成jpg的话就是200x200大小,存成gif的话就是640x480大小。为什么呢?

翻了一下GIF图像格式,发现GIF的基本结构是一个logical screen里面放若干image。而convert根据原图大小和裁剪区域把logical screen和image设置成了相应的值。所以在上例中logical screen的大小是640x480,而里面image的大小是200x200。至于看图软件具体显示哪一个值,不同的软件未必一样。如feh/display只显示GIF的有效image区域,即200x200,而firefox会显示整个logical screen,即640x480。

Links: