代码之家  ›  专栏  ›  技术社区  ›  zaf

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

  •  62
  • zaf  · 技术社区  · 14 年前

    我正在寻找最小的(就文件大小而言)透明的1像素图像。

    目前我有一个49字节的gif,这似乎是最流行的。

    但我记得很多年前有一个不到40字节。可能是32字节。

    有谁能做得更好吗?只要现代网络浏览器能够显示图形格式并尊重其透明度,就不必担心图形格式。

    更新 :好的,我找到了一个42字节透明的单像素gif: http://bignosebird.com/docs/h3.shtml

    更新2 :在某些客户端中,任何小于43字节的内容都可能不稳定。不能这样。

    11 回复  |  直到 6 年前
        1
  •  19
  •   kenorb    7 年前

    签出此 blank.gif 文件(43字节)。小于49:d

        2
  •  80
  •   bryc    6 年前

    这里是一个 32 byte transparent 应该在任何地方都有效的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 spec ,每个组件可以按如下方式分解:

    1. 文件签名/版本,6字节
    2. 逻辑屏幕描述块 ,7字节
    3. 可选的: 全局颜色表 ,6字节
    4. 可选的: 图形控件扩展 ,8字节
    5. 图像描述块 ,10字节
    6. LZW数据 ,1-4字节3
    7. 可选的: 拖车 ( 0x3B ),1字节

    这个 全局颜色表 可以通过在 Logical Screen Descriptor
    这是大多数软件透明性所必需的
    只需要3个字节的lzw数据,而且这些字节几乎可以是任何东西。尽管只有第一个字节 0x02 是严格要求的。
    拖车可以移除而不会产生不良影响。

    大多数gif软件都需要一个全局/局部颜色表。进一步的缩减(例如删除全局颜色表)可能在某些浏览器中起作用,但它们的效果通常是特定于实现的。 编辑:有一个 flag 禁用全局颜色表,它似乎不会引起任何问题。

    其他示例:

    以下24个字节在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=
    
        3
  •  26
  •   Jacob    14 年前

    以下是我在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");
    
        4
  •  18
  •   Michiel Cornille    13 年前

    为了扩展jacob的字节数组答案,我为 透明的 我用photoshop制作的1x1gif。

    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};
    
        5
  •  14
  •   polpo    11 年前

    http://polpo.org/blank.gif 是用gifsicle制作的37字节透明gif。

    以CSS就绪的Base64格式:

    data:image/gif;base64,R0lGODlhAQABAHAAACH5BAUAAAAALAAAAAABAAEAAAICRAEAOw==
    
        6
  •  7
  •   miku    14 年前
    • 见: 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
    
        7
  •  4
  •   s3v3n    12 年前

    透明点,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脆弱时期),我不记得来源了。我找到的最新的一个 here .

    备注:用于跟踪目的,而不是作为间隔物。

        8
  •  1
  •   kenorb    7 年前

    我认为这是最难忘的1x1(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个字节你可以输入任何东西,浏览器可以解析它

    例如 /// !!! ,,, ;;; +++

    最后一个字节必须是: ; , !

    顺便说一下,如果你用 // \\\ 在大小旁边的3个字节处

    页面标题将显示最后一个字符,否则将显示 gif,...

    用chrome测试,firefox都能用,ie不能用

        9
  •  0
  •   T. Stone    14 年前

    http://www.maproom.co.uk/0.gif 是43字节,稍微刮一下。

        10
  •  0
  •   Andreas Bonini    14 年前

    你不应该真的用“间隔礼物”。它们是在90年代使用的;现在它们已经非常过时了,而且没有任何用途,而且它们会导致一些可访问性和兼容性问题。

    使用CSS。

        11
  •  0
  •   Jake Petroules    12 年前

    我记得有一次,很久以前,我试图创建最小的gif。如果你遵循标准,如果我没记错的话,大小是32字节。但你可以“破解”规范,并有一个26-28字节,这将显示在大多数浏览器。这个gif不是完全“正确”的,但有时是有效的。只需使用gif头规范和十六进制编辑器。