Какой наименьший допустимый размер файла JPEG (в байтах) - PullRequest
24 голосов
/ 12 февраля 2010

Я бы хотел проверить некоторые jpegs на валидность, прежде чем отправлять их по сети для более тщательной проверки. Достаточно легко проверить правильность верхнего и нижнего колонтитула, но какой наименьший размер (в байтах) может быть допустимым jpeg?

Ответы [ 7 ]

16 голосов
/ 28 февраля 2010

1x1 серый пиксель в 125 байтах с использованием арифметического кодирования, все еще в стандарте 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. Все декодеры справятся с этим, но в стандарте сказано, что оно должно заканчиваться одним.

9 голосов
/ 09 июня 2014

Я понимаю, что это старый вопрос, но мне кажется, что вы могли бы сделать прогрессивный 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 байт), поэтому его все равно следует считать самым маленьким из известных.

4 голосов
/ 17 мая 2015

Попробуйте следующее (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

Источник: Самый маленький в мире, действительный JPEG? от Jesse_hz

2 голосов
/ 12 февраля 2010

Вот подпрограмма 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, как предлагается в другом ответе, например.

1 голос
/ 13 апреля 2016

найдено "самый маленький GIF-файл" с 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;'
0 голосов
/ 25 октября 2010

Хотя я понимаю, что это далеко не самый маленький действительный jpeg и не имеет ничего общего с вашим актуальным вопросом, я чувствовал, что должен поделиться этим, так как я искал очень маленький JPEG, который на самом деле выглядел как нечто некоторые испытания, когда я нашел ваш вопрос. Я делюсь этим здесь, потому что он действительный, маленький и делает меня ROFL.

Вот изображение JPEG размером 384 байта, которое я сделал в фотошопе. Это буквы 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
0 голосов
/ 20 июня 2010

Не требуется, чтобы JPEG содержал маркер JFIF или Exif. Но они должны начинаться с FF D8, и после этого у них должен быть маркер, чтобы вы могли проверить FF D8 FF.

...