2010-02-12 20 views
21

Tôi muốn sàng lọc một số jpeg để có hiệu lực trước khi gửi chúng qua mạng để kiểm tra rộng rãi hơn. Thật dễ dàng để kiểm tra đầu trang và chân trang hợp lệ, nhưng kích thước nhỏ nhất (bằng byte) là jpeg hợp lệ có thể là gì?Kích thước tệp jpeg hợp lệ nhỏ nhất (tính bằng byte)

+3

libjpeg có thể làm bài kiểm tra nhanh chóng, hãy xem xét sử dụng nó chứ không phải đoán. – Tronic

+4

Tôi không muốn thêm bất kỳ thư viện bổ sung nào vào ứng dụng của mình. Ngoài ra, nó không phải là đoán nếu ai đó nói với tôi câu trả lời đúng :) – twk

+1

Bạn có lẽ nên thay đổi câu hỏi của bạn để "kiểm tra nếu một số jpegs có lẽ là hợp lệ" trừ khi bạn sẽ làm một loạt các bài kiểm tra khác nếu thử nghiệm kích thước tập tin vượt qua. Nếu không, sẽ dễ dàng tạo ra một ảnh JPEG không hợp lệ với bất kỳ kích thước nào trên kích thước tối thiểu của một JPEG hợp lệ. – jball

Trả lời

16

Một 1x1 pixel màu xám trong 125 byte sử dụng mã hóa số học, vẫn còn trong tiêu chuẩn JPEG ngay cả khi hầu hết các bộ giải mã không thể giải mã nó:

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 

Tôi không nghĩ rằng đề cập 134 byte ví dụ là tiêu chuẩn, vì nó thiếu một EOI. Tất cả các bộ giải mã sẽ xử lý điều này nhưng tiêu chuẩn nói rằng nó sẽ kết thúc bằng một.

+4

Những byte nào an toàn để tăng thêm để tạo ra một loạt các ảnh JPEG nhỏ nhưng khác nhau? –

+0

@Quolonel Questions - 8x8 'square' của byte trong phân đoạn DQT về cơ bản là yếu tố mở rộng, bất kỳ giá trị nào trong số đó có thể là giá trị 1-255. Tôi nghĩ rằng giá trị duy nhất được sử dụng trong phân đoạn DAC của ví dụ này là giá trị đầu tiên ở phía trên bên trái của khối 8x8. – matja

2

Đây là thói quen C++ tôi đã viết để làm điều này:

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 điểm để một bộ đệm chứa dữ liệu JPEG. Tôi chắc rằng bạn cần nhiều byte hơn để có một JPEG sẽ giải mã thành một hình ảnh hữu ích, nhưng đó là một cược công bằng nếu 10 byte đầu tiên vượt qua bài kiểm tra này, bộ đệm có thể chứa một JPEG.

EDIT: Bạn có thể, tất nhiên, thay thế 10 ở trên bằng giá trị cao hơn khi bạn quyết định một. 134, như đề xuất trong câu trả lời khác, ví dụ.

0

Không yêu cầu JPEG có chứa dấu JFIF hoặc Exif. Nhưng họ phải bắt đầu với FF D8, và họ phải có một điểm đánh dấu sau đó, vì vậy bạn có thể kiểm tra FF D8 FF.

+0

Đây là một bình luận tuyệt vời, nhưng không trả lời câu hỏi của OP. Cân nhắc đặt nó dưới một câu trả lời khác. –

0

Trong khi tôi nhận ra điều này là xa jpeg hợp lệ nhỏ nhất và có ít hoặc không có gì để làm với câu hỏi thực tế của bạn, tôi cảm thấy tôi nên chia sẻ này như tôi đã tìm kiếm một JPEG rất nhỏ mà thực sự trông giống như một cái gì đó để làm một số thử nghiệm với khi tôi đã tìm thấy câu hỏi của bạn. Tôi đang chia sẻ nó ở đây bởi vì nó hợp lệ, nhỏ bé của nó, và nó làm cho tôi ROFL.

Đây là hình ảnh JPEG 384 byte mà tôi đã tạo trong photoshop. Đó là chữ ROFL được vẽ bởi tôi và sau đó được lưu với các cài đặt nén tối đa trong khi vẫn có thể đọc được.

chuỗi Hex:

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 thoát dữ liệu hình ảnh nhị phân (có thể dán ngay vào một 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

Đó là mã perl trong trường hợp ai đó tự hỏi. – kristianp

7

Tôi nhận ra đây là một câu hỏi cũ, nhưng nó xảy ra với tôi bạn có thể làm một jpeg tiến bộ chỉ với các hệ số DC, một điểm ảnh màu xám duy nhất có thể được mã hóa thành 119 byte. Điều này chỉ đọc tốt trong một vài chương trình tôi đã thử nó trong (Photoshop và những người khác).

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 

Tiết kiệm không gian chính là chỉ có một bảng Huffman. Mặc dù điều này hơi nhỏ hơn mã hóa số học 125 byte được đưa ra trong câu trả lời khác, nhưng việc mã hóa số học mà không có tiêu đề JFIF sẽ nhỏ hơn (107 byte), do đó vẫn được coi là nhỏ nhất được biết đến.

+0

Đối với những người tò mò, khi cố gắng để đọc này với iOS ''[UIImage imageWithData:]' nó kết quả đầu ra: 'ImageIO: JPEG Dữ liệu JPEG bị hỏng: 2 byte không liên quan trước khi đánh dấu 0xda'. –

4

Hãy thử như sau (134 byte):

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 

Nguồn: Worlds Smallest, Valid JPEG? bởi Jesse_hz

-1

Tìm thấy "the tiniest GIF ever" với chỉ 26 byte.

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 đen:

b'GIF89a\x01\x00\x01\x00\x00\xff\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x00;' 
Các vấn đề liên quan