代码之家  ›  专栏  ›  技术社区  ›  twk Mark Adler

最小有效的jpeg文件大小是多少(字节)

  •  23
  • twk Mark Adler  · 技术社区  · 15 年前

    我想筛选一些JPEG的有效性,然后再通过网络发送它们进行更广泛的检查。检查有效的页眉和页脚很容易,但是有效的jpeg可以有多小(以字节为单位)?

    7 回复  |  直到 9 年前
        1
  •  16
  •   matja    15 年前

    使用算术编码的125字节1x1灰色像素,仍在jpeg标准中,即使大多数解码器无法对其进行解码:

    ff d8 : SOI
    ff e0 ; APP0
     00 10
     4a 46 49 46 00 01 01 01 00 48 00 48 00 00
    ff db ; DQT
     00 43
     00
     03 02 02 02 02 02 03 02
     02 02 03 03 03 03 04 06
     04 04 04 04 04 08 06 06
     05 06 09 08 0a 0a 09 08
     09 09 0a 0c 0f 0c 0a 0b
     0e 0b 09 09 0d 11 0d 0e
     0f 10 10 11 10 0a 0c 12
     13 12 10 13 0f 10 10 10
    ff c9 ; SOF
     00 0b
     08 00 01 00 01 01 01 11 00
    ff cc ; DAC
     00 06 00 10 10 05
    ff da ; SOS
     00 08
     01 01 00 00 3f 00 d2 cf 20
    ff d9 ; EOI
    

    我不认为上面提到的134字节示例是标准的,因为它缺少一个EOI。所有译码器都会处理这个问题,但标准规定它应该以一个结尾。

        2
  •  8
  •   garlon4    9 年前

    我知道这是一个古老的问题,但我突然想到,你可以制作一个只包含dc系数的渐进式jpeg,一个灰色像素可以用119字节编码。这在我尝试过的一些程序(photoshop和其他程序)中读起来很好。

    ff d8 : SOI
    ff db ; DQT
     00 43
     00
     01 01 01 01 01 01 01 01
     01 01 01 01 01 01 01 01
     01 01 01 01 01 01 01 01
     01 01 01 01 01 01 01 01
     01 01 01 01 01 01 01 01
     01 01 01 01 01 01 01 01
     01 01 01 01 01 01 01 01
     01 01 01 01 01 01 01 01
    ff c2 ; SOF
     00 0b
     08 00 01 00 01 01 01 11 00
    ff c4 ; DHT
     00 14
     00
     01 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00
     03
    ff da ; SOS
     00 08
     01 01 00 00 00 01 3F
    ff d9 ; EOI
    

    节省的主要空间是只有一张哈夫曼桌子。虽然这比另一个答案中给出的125字节的算术编码稍小,但不带JFIF头的算术编码将更小(107字节),因此仍应将其视为已知的最小值。

        3
  •  4
  •   kenorb    10 年前

    尝试以下操作(134字节):

    FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 48 00 48 00 00
    FF DB 00 43 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF C2 00 0B 08 00 01 00 01 01 01
    11 00 FF C4 00 14 10 01 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 FF DA 00 08 01 01 00 01 3F 10
    

    来源: Worlds Smallest, Valid JPEG? 杰西斯赫兹

        4
  •  2
  •   Warren Young    15 年前

    下面是我编写的C++例程:

    bool is_jpeg(const unsigned char* img_data, size_t size)
    {           
        return img_data &&
               (size >= 10) &&
               (img_data[0] == 0xFF) &&
               (img_data[1] == 0xD8) &&
               ((memcmp(img_data + 6, "JFIF", 4) == 0) ||
                (memcmp(img_data + 6, "Exif", 4) == 0));
    }
    

    img_data 指向包含jpeg数据的缓冲区。

    我确信你需要更多的字节来让一个jpeg解码成一个有用的图像,但是可以肯定的是,如果前10个字节通过了这个测试,缓冲区可能包含一个jpeg。

    编辑 :当然,一旦决定了一个值,就可以用更大的值替换上面的10。134,如另一个答案所建议的那样。

        5
  •  1
  •   Henrique Bastos    9 年前

    找到 "the tiniest GIF ever" 仅用 26字节 .

    47 49 46 38 39 61 01 00 01 00 
    00 ff 00 2c 00 00 00 00 01 00 
    01 00 00 02 00 3b
    

    Python文字:

    b'GIF89a\x01\x00\x01\x00\x00\xff\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x00;'
    
        6
  •  0
  •   jsam    14 年前

    JPEGS不要求包含JFIF或EXIF标记。但它们必须从FF D8开始,并且它们后面必须有一个标记,这样您就可以检查FF D8 FF了。

        7
  •  0
  •   Martijn Pieters    12 年前

    虽然我意识到这远远不是最小的有效jpeg,与您的实际问题几乎没有关系,但我觉得我应该分享这一点,因为我一直在寻找一个非常小的jpeg,当我找到您的问题时,它实际上看起来像是要做一些测试的东西。我在这里分享它是因为它是有效的,它很小,而且它让我喜欢。

    这是我在Photoshop中制作的384字节的jpeg图像。它是由我手工绘制的字母ROFL,然后以最大压缩设置保存,同时仍然具有一定的可读性。

    十六进制序列:

    my @image_hex = qw{
     FF D8 FF E0 00 10 4A 46 49 46 00 01 02 00 00 64
     00 64 00 00 FF EC 00 11 44 75 63 6B 79 00 01 00
     04 00 00 00 00 00 00 FF EE 00 0E 41 64 6F 62 65
     00 64 C0 00 00 00 01 FF DB 00 84 00 1B 1A 1A 29
     1D 29 41 26 26 41 42 2F 2F 2F 42 47 3F 3E 3E 3F
     47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
     47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
     47 47 47 47 47 47 47 47 47 47 47 47 01 1D 29 29
     34 26 34 3F 28 28 3F 47 3F 35 3F 47 47 47 47 47
     47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
     47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
     47 47 47 47 47 47 47 47 47 47 47 47 47 FF C0 00
     11 08 00 08 00 19 03 01 22 00 02 11 01 03 11 01
     FF C4 00 61 00 01 01 01 01 00 00 00 00 00 00 00
     00 00 00 00 00 00 04 02 05 01 01 01 01 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 02 04 10 00 02
     02 02 02 03 01 00 00 00 00 00 00 00 00 00 01 02
     11 03 00 41 21 12 F0 13 04 31 11 00 01 04 03 00
     00 00 00 00 00 00 00 00 00 00 00 00 21 31 61 71
     B1 12 22 FF DA 00 0C 03 01 00 02 11 03 11 00 3F
     00 A1 7E 6B AD 4E B6 4B 30 EA E0 19 82 39 91 3A
     6E 63 5F 99 8A 68 B6 E3 EA 70 08 A8 00 55 98 EE
     48 22 37 1C 63 19 AF A5 68 B8 05 24 9A 7E 99 F5
     B3 22 20 55 EA 27 CD 8C EB 4E 31 91 9D 41 FF D9
    }; #this is a very tiny jpeg. it is a image representaion of the letters "ROFL" hand drawn by me in photoshop and then saved at the lowest possible quality settings where the letters could still be made out :)
    
    my $image_data = pack('H2' x scalar(@image_hex), @image_hex);
    my $url_escaped_image = uri_escape( $image_data );
    

    URL转义的二进制图像数据(可以直接粘贴到URL中)

    %FF%D8%FF%E0%00%10JFIF%00%01%02%00%00d%00d%00%00%FF%EC%00%11Ducky%00%01%00%04%00%00%00%00%00%00%FF%EE%00%0EAdobe%00d%C0%00%00%00%01%FF%DB%00%84%00%1B%1A%1A)%1D)A%26%26AB%2F%2F%2FBG%3F%3E%3E%3FGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG%01%1D))4%264%3F((%3FG%3F5%3FGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG%FF%C0%00%11%08%00%08%00%19%03%01%22%00%02%11%01%03%11%01%FF%C4%00a%00%01%01%01%01%00%00%00%00%00%00%00%00%00%00%00%00%00%04%02%05%01%01%01%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%02%04%10%00%02%02%02%02%03%01%00%00%00%00%00%00%00%00%00%01%02%11%03%00A!%12%F0%13%041%11%00%01%04%03%00%00%00%00%00%00%00%00%00%00%00%00%00!1aq%B1%12%22%FF%DA%00%0C%03%01%00%02%11%03%11%00%3F%00%A1~k%ADN%B6K0%EA%E0%19%829%91%3Anc_%99%8Ah%B6%E3%EAp%08%A8%00U%98%EEH%227%1Cc%19%AF%A5h%B8%05%24%9A~%99%F5%B3%22%20U%EA'%CD%8C%EBN1%91%9DA%FF%D9