Kích thước lớn nhất của JPEG 640x480 là gì?


25

Tôi đang tạo một thiết bị lưu trữ dữ liệu chụp một số hình ảnh nhất định về bầu trời đêm trong vài giờ và các hình ảnh sẽ được tải xuống ngay sau khi tất cả chúng được chụp. Thẻ nhớ phải có khả năng lưu trữ tất cả các hình ảnh cùng một lúc.

Các JPEG sẽ được chụp là 640x480 pixel và điều cần thiết là có đủ chỗ trên thẻ nhớ cho tất cả 100 người trong số họ. Vậy kích thước lớn nhất của JPEG 640x480 là bao nhiêu?

Tôi đã chụp một số hình ảnh thử nghiệm để tìm ra điều này:

# 1# 2# 3

  • Kích thước tệp của hình ảnh "stackoverflow" là 73.774 byte.
  • Kích thước tệp của hình ảnh trắng chỉ 36.607 byte.
  • Nhưng kích thước tệp cho đồng hồ ảnh rô ở mức 149.339 byte.

Tôi giả định rằng kích thước tập tin tăng lên với độ phức tạp.

Làm cách nào tôi có thể xây dựng đủ chỗ trên thẻ nhớ để phù hợp với 100 640x480 JPEGS, mà không cần biết chúng sẽ phức tạp và kích thước như thế nào? Tôi không muốn lãng phí thêm không gian vì tôi có thể tạo ra nhiều thiết bị chụp này.


nó phụ thuộc vào nhà sản xuất hình ảnh. JPEG 100 chất lượng có thể dễ dàng thổi lên kích thước. Cài đặt máy ảnh và máy ảnh của bạn là gì?
John Dvorak

Máy ảnh thử nghiệm là Canon Powershot A1100 IS. Để biết thêm thông tin, bạn có thể kiểm tra siêu dữ liệu, vì tôi không chắc chắn những gì bạn đang yêu cầu.
Băng xanh

1
HAve bạn đã chụp bất kỳ hình ảnh mẫu của bầu trời đêm tại Dif. Cài đặt Q? Như một bài kiểm tra?
Carl B

2
Cái này để làm gì? Bạn có chắc chắn jpeg là lựa chọn đúng định dạng.
Jack Aidley

3
Thêm một số nền tảng để nhận xét Jack Aidley: Nén JPEG thay đổi hình ảnh. Nó đưa ra các giả định và loại bỏ thông tin để có được kích thước tệp nhỏ hơn. (Trừ khi được đặt thành chất lượng 100%, trong trường hợp đó bạn cũng có thể sử dụng định dạng không nén. Thông thường, máy ảnh kỹ thuật số có cài đặt thô hoặc thậm chí là cài đặt thô cho điều này. Nếu bạn muốn giữ tất cả các chấm nhỏ như sao thì hãy sử dụng một trong các những cái này) Điều này cũng sẽ làm cho kích thước của một hình ảnh hoàn toàn có thể dự đoán được.
Hennes

Câu trả lời:


22

Ở đây tôi đề nghị một giới hạn trên cho kích thước tệp JPEG. Xem câu trả lời của Ilmari Karonen để thảo luận về các kích thước jpeg điển hình hơn.

Không gian lưu trữ pixel cho hình ảnh bitmap 32 bit 640X480 có thể được tính như vậy (dựa trên câu trả lời này , nhưng được sửa dựa trên nhận xét của Ignacio Vazquez-Abrams và câu trả lời này ):

Giả sử rằng không có nén nào được áp dụng cho tệp, có 307.200 pixel, là 0,3MP. Bàn tiện dụng

Nếu mỗi pixel chứa 32 bit thông tin, thì

  1. 307.200 * 32 = 9.830.400 bit thông tin
  2. Chia cho 8 bit để trở thành giá trị byte
  3. 9,830,400 / 8 = 1228800 byte (Hoặc 1,17 Mb)

Đây là kích thước của bitmap không nén và do đó phải là giới hạn trên của kích thước tệp jpeg (Trong thực tế, vì định dạng JPEG sử dụng nén , hình ảnh của bạn phải nhỏ hơn nhiều, đặc biệt là khi bạn chụp ảnh đêm bầu trời mà tôi tưởng tượng chứa rất nhiều màu đen. Lưu ý rằng hình ảnh ví dụ lớn nhất trong câu hỏi của bạn chỉ là 0,14 MB).

Tuy nhiên, đối với vấn đề cụ thể của bạn, ngay cả khi sử dụng giới hạn trên đó, 100 hình ảnh chỉ là 117 MB và đã lâu rồi tôi mới thấy thẻ nhớ nhỏ tới 128 MB. Tôi nghi ngờ bất kỳ thẻ nhớ hiện có sẵn sẽ có đủ dung lượng để đáp ứng nhu cầu của bạn.

Rõ ràng vấn đề kích thước tệp jpeg tối đa là đối tượng của một số tranh luận. Đây câu trả lời Stack Overflow cho thấy kích thước tối đa lý thuyết của 20,25 byte cho mỗi pixel, hoặc 5.9 MB trong trường hợp của bạn, nhưng sản xuất một hình ảnh có kích thước mà đòi hỏi phải sử dụng sai ý của chương trình nén định dạng jpeg, vì vậy nó rất không chắc rằng bạn muốn bao giờ thấy như vậy một thứ được sản xuất bởi một máy ảnh.


1
Thật không may, ngay cả giá trị bitmap không nén cũng chỉ hơi thấp, vì nó giả định việc đóng gói. Một bitmap đã giải nén sử dụng 32 bit cho mỗi pixel (vì lý do căn chỉnh ), tăng kích thước tệp lên 33%.
Ignacio Vazquez-Abrams

Cảm ơn @ IgnacioVazquez-Abrams. Đó là những gì tôi nhận được khi cho rằng một câu trả lời được chấp nhận là chính xác.
ForeverWintr

1
@ IgnacioVazquez-Abrams - "Căn chỉnh" là một thuộc tính được xử lý bởi bộ xử lý (không phải phương tiện lưu trữ) và thuận tiện khi dữ liệu nằm trong RAM để xử lý. Đối với mục đích lưu trữ, căn chỉnh từ 32 bit không phải là một điều cần thiết và chắc chắn là một sự hoang phí. Đóng gói dữ liệu là một hoạt động phổ biến trước khi ghi vào lưu trữ, đặc biệt là tiết kiệm 25% nhất định. Tôi đã thấy các máy ảnh kỹ thuật số lưu trữ từng pixel ở chính xác 3 byte cho định dạng thô.
mùn cưa

1
"... chắc chắn là một sự hoang phí." Ngày nay. Nhiều mặt trăng trước đây từng được coi là một tính năng tiết kiệm chu kỳ (không cần căn chỉnh tải, cho biết sẽ mất bao lâu).
Ignacio Vazquez-Abrams

3
Trong thực tế, trong khi một số hệ thống có thể lưu trữ dữ liệu hình ảnh RGB là 4 byte cho mỗi pixel trong bộ nhớ , thì hầu như tất cả các định dạng tệp hình ảnh đều sử dụng tối đa 3 byte cho mỗi pixel (trừ khi có một kênh alpha thực được lưu trữ trong byte thứ tư). Xem câu trả lời của tôi dưới đây.
Ilmari Karonen

35

Chỉ để kiểm tra, hãy để tôi kiểm tra phân tích của ForeverWintr bằng thực nghiệm.

Loại hình ảnh đầu vào tồi tệ nhất để nén JPEG (hoặc bất kỳ nén nào , thực sự) là nhiễu RGB ngẫu nhiên đồng nhất, về mặt lý thuyết là không thể nén được. Vì vậy, hãy để tôi tạo một số bằng cách sử dụng các công cụ netpbm :

$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772  rnd.png
921615  rnd.ppm

Nhiễu RGB ngẫu nhiên đồng nhất, định dạng PNG lossless
(Nhiễu RGB ngẫu nhiên đồng nhất, định dạng PNG không mất dữ liệu, 903 kb)

Lưu ý (Tháng 3 năm 2017): Tôi khá chắc chắn hình ảnh ở trên định dạng PNG khi lần đầu tiên tôi viết câu trả lời này và tải nó trở lại vào năm 2013. (Thậm chí còn có một nhận xét về quản lý màu bên dưới ngụ ý mạnh mẽ điều này.) Thật không may, nó sẽ dường như nó đã được chuyển đổi âm thầm thành JPEG tại một số điểm, làm cho việc so sánh trực quan ở đây trở nên vô dụng.

Tôi đã thử tải lại một hình ảnh thử nghiệm PNG mới, nhưng rõ ràng nó đã đạt đến một loại giới hạn kích thước tệp PNG tùy ý tại imgur và được tự động chuyển đổi thành JPEG. Tôi không chắc có cách nào khác trong vấn đề này không, nhưng ít nhất nếu bạn có quyền truy cập vào hộp Linux, bạn luôn có thể chạy lại các lệnh đã cho để tạo hình ảnh thử nghiệm của riêng mình. Trong mọi trường hợp, ngoài việc ngăn chặn so sánh trực tiếp chất lượng nén, điều này không làm mất hiệu lực phân tích dưới đây dưới bất kỳ hình thức nào.

OK, do đó, tệp PPM không nén có chiều dài 640 × 480 × 3 = 921.600 byte, cộng với 15 byte cho tiêu đề PPM tối thiểu, đúng như mong đợi. Cố gắng nén nó một cách dễ dàng bằng định dạng PNG cuối cùng chỉ tăng kích thước lên 2157 byte, có lẽ được đưa lên bởi các tiêu đề và siêu dữ liệu PNG và có thể có một chút không hiệu quả trong thuật toán nén khi cố nén dữ liệu không thể nén được.

(Có, đó là 3 byte cho mỗi pixel, không phải 4; ngay cả định dạng PPM, đơn giản như định dạng tệp đồ họa có thể nhận được, không đủ để lưu trữ một byte thứ tư vô dụng trên mỗi pixel trên đĩa. Có thể có một số lợi thế để làm như vậy trong bộ nhớ vì lý do căn chỉnh, đặc biệt là nếu bạn cũng cần lưu trữ kênh alpha, nhưng những lý do đó không áp dụng khi ghi hình ảnh vào tệp.)

OK, vậy còn JPEG thì sao? Trước tiên, hãy thử giảm thiểu tổn thất nén (chất lượng = 100, không lấy mẫu màu, DCT dấu phẩy động). Thật không may, pnmtojpeghướng dẫn không giải thích rõ ràng cách đặt tất cả các tùy chọn có liên quan (cụ thể, -sampletùy chọn được liệt kê trong phần "Tùy chọn cho trình hướng dẫn", chỉ tham chiếu một tệp trong tài liệu libjpeg), vì vậy tôi sẽ chuyển đổi nó trong thay vào đó là GIMP. Các tập tin kết quả trông như thế này:

897249  rnd.jpg

Độ nhiễu RGB nén RGB, chất lượng = 100, không có mẫu phụ sắc độ
(Độ nhiễu RGB nén RGB, chất lượng = 100, không có mẫu phụ sắc độ, 876 kb)

Cái gì, làm thế nào nó có thể nhỏ hơn? Không phải tôi vừa nói tiếng ồn thuần túy là không thể nén được sao? Vâng, điều này là, ngay cả ở chất lượng tối đa, nén JPEG bình thường không phải là khá mất mát. Mở lại hình ảnh trong GIMP và so sánh nó với bản gốc, người ta có thể thấy rằng một số pixel đã có các giá trị màu của chúng bị dịch chuyển theo một hoặc hai bước (trong số 256). Đó là những pixel mà thuật toán nén JPEG "bị lừa" và ném đi một chút ở đây, một điểm khác ở đó, nơi nó ước tính rằng sự thay đổi sẽ không đáng chú ý. Thật vậy, đối với mắt người không được trả tiền, kết quả khá khác biệt so với ban đầu, nhưng các bit bị loại bỏ đó làm tăng kích thước tệp có thể đo được, ngay cả sau khi tính toán tiêu đề và mã hóa.

Vì vậy, đó là chất lượng tối đa; Còn các cài đặt điển hình hơn, như pnmtojpegmặc định (quality = 75, bật mẫu phụ) thì sao? Hãy thử nó:

$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128  rnd2.jpg

Độ nhiễu JPEG nén RGB, chất lượng = 75, lấy mẫu màu
(Độ nhiễu RGB nén RGB, chất lượng = 75, lấy mẫu màu, 184 kb)

Ồ, từ 901 xuống còn 184 kb! Tuy nhiên, đó là nén khá tích cực và bạn chắc chắn có thể nhận ra sự khác biệt khi so sánh các hình ảnh một cách chặt chẽ. Hầu hết là do sự thay đổi sắc độ, về cơ bản chỉ cần loại bỏ 75% dữ liệu màu (màu sắc / độ bão hòa). Việc thử nó trong GIMP với tính năng lấy mẫu con bị vô hiệu hóa sẽ cho ra một tệp 350.618 byte vẫn trông (ít nhất là với mắt người), khá gần với bản gốc ngay cả khi được phóng to.

Dù sao, quan điểm của tất cả những điều này là chứng minh rằng, cho dù ảnh trên bầu trời đêm của bạn có ồn đến mức nào, và cho dù bạn có thể chọn chất lượng cao đến đâu, thì không có cách nào để tệp JPEG 640 × 480 có thể lớn hơn đáng kể hơn 900 kb. (Chà, trừ khi máy ảnh của bạn gắn cấu hình màu Exif nhiều megabyte với nó hoặc một cái gì đó không kém phần ngu ngốc, đó là.) Và nếu bạn đang sử dụng các cài đặt nén JPEG điển hình hơn, kích thước tệp hợp lý tối đa sẽ giảm xuống khoảng 200 kb hoặc hơn .


4
về mặt lý thuyết không thể nén chỉ để nén lossless, phải không?
Daniel Beck

1
@DanielBeck: Phải. Rõ ràng, bạn có thể nén bất kỳ dữ liệu nào bạn muốn nếu bạn muốn loại bỏ các phần của nó. (Về cơ bản, đó là cách nén JPEG, nó chỉ cố gắng thực hiện theo cách mà các phần bị mất không thể nhận thấy bằng mắt người và những gì còn sót lại có thể được mã hóa gọn. Tiếng ồn vẫn là một trường hợp khó khăn đối với nó, vì điều duy nhất ngay cả một thuật toán nén mất mát có thể làm với nhiễu là vứt bỏ các phần của nó.)
Ilmari Karonen

Có lẽ đó chỉ là tôi, nhưng hình ảnh thứ hai trông sáng hơn hình thứ nhất.
Bogdacutu

@Bogdacutu: Không nên, mặc dù luôn có khả năng trình duyệt của bạn có thể làm điều gì đó kỳ lạ với quản lý màu, v.v ... Hãy thử tải cả hai trong trình chỉnh sửa đồ họa và so sánh các giá trị màu.
Ilmari Karonen

Viết hay @Ilmari.
ForeverWintr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.