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)
Trả lời
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.
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? –
@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
Đâ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ụ.
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.
Đâ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. –
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
Đó là mã perl trong trường hợp ai đó tự hỏi. – kristianp
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.
Đố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'. –
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
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;'
- 1. Nhận ngoại lệ: Thuộc tính kích thước có kích thước không hợp lệ 0
- 2. Kích thước tệp tối đa của hình ảnh JPEG có kích thước đã biết
- 3. Cách tốt nhất để lưu trữ kích thước tệp bằng byte?
- 4. Tính kích thước tệp trong vỏ
- 5. Kích thước tốt (tính bằng byte) cho tệp nhật ký là gì?
- 6. Thuộc tính kích thước có kích thước không hợp lệ là 0
- 7. Thay đổi kích thước hình ảnh jpeg thành kích thước được chỉ định
- 8. Nhận kích thước tệp bằng Python?
- 9. tỷ lệ nén jpeg
- 10. Cách lấy kích thước hình ảnh (byte) bằng PIL
- 11. Giảm kích thước tệp PDF được tạo bằng Quartz2D
- 12. giải nén file Zip Ngoại lệ: kích thước entry không hợp lệ (dự kiến 193.144 nhưng có 193.138 byte)
- 13. Tính kích thước byte của đối tượng Java
- 14. Cách tính kích thước tệp âm thanh?
- 15. Cách giảm kích thước tệp hình ảnh bằng PIL
- 16. Kích thước JFrame quá nhỏ
- 17. Lưu trữ Azure: Các tệp đã tải lên có kích thước bằng không byte
- 18. Trích xuất hình thu nhỏ từ tệp jpeg
- 19. Cách nhận kích thước byte của chuỗi nhiều byte
- 20. Ruby nhận được kích thước tính bằng byte của một mảng
- 21. java.security.InvalidKeyException: Kích thước khóa bất hợp pháp
- 22. Tạo tệp có kích thước nhất định trong Java
- 23. Kích thước di động Jquery quá nhỏ
- 24. Tăng kích thước của tệp nhỏ gọn 3.5 .sdf bằng cách sử dụng C#
- 25. Thay đổi kích thước tệp PDF bằng Ghostscript
- 26. Kích thước tuyến tính lớn nhất 2d của các điểm
- 27. Đọc không hợp lệ kích thước 8 - Valgrind + C
- 28. Valgrind không hợp lệ đọc kích thước của 1
- 29. Kích thước khối Hadoop và vấn đề kích thước tệp?
- 30. Hadoop MapReduce: Kích thước tệp đầu vào phù hợp?
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
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
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