Який розмір JPEG розміром 640x480?


25

Я створюю пристрій для зберігання даних, який протягом декількох годин робить певну кількість знімків нічного неба, а фотографії завантажуватимуться відразу після того, як вони будуть зроблені. Картка пам'яті повинна мати можливість зберігати всі фотографії одночасно.

JPEG, які будуть зроблені, мають 640х480 пікселів, і важливо, щоб на картці пам'яті було достатньо місця для всіх 100 з них. Тож який найбільший розмір JPEG 640x480?

Я зробив кілька тестових знімків, щоб зрозуміти це:

№1№2№3

  • Розмір файлу зображення "stackoverflow" - 73,774 байт.
  • Розмір файлу білого зображення становить лише 36 607 байт.
  • Але розмір файлу для картатих фотографій синхронізується у 149,339 байт.

Я припускаю, що розмір файлу збільшується зі складністю.

Як я можу побудувати достатньо місця на картці пам'яті для розміщення 100 640x480 JPEGS, не знаючи, наскільки складними вони будуть і якого розміру? Я не хочу витрачати зайвий простір, оскільки, можливо, я роблю багато таких пристроїв захоплення.


це залежить від виробника зображення. 100-якісний JPEG може легко підірвати розміри. Які налаштування камери та камери?
Джон Дворак

Тестова камера - це Canon Powershot A1100 IS. Для отримання додаткової інформації ви можете перевірити метадані, оскільки я не впевнений, що ви просите.
Blue Ice

1
ВИНИМАЄТЕ будь-які зразкові знімки нічного неба в dif. Налаштування Q? Як тест?
Карл Б

2
Що це за ? Ви впевнені, що jpeg - це правильний вибір формату.
Джек Едлі

3
Додайте деякі коментарі до коментаря Джека Айдліса: стиснення JPEG змінює зображення. Він робить припущення та відкидає інформацію, щоб отримати менший розмір файлу. (Якщо встановлено не 100% якість, то в цьому випадку ви можете також використовувати формат нестисненого формату. Часто цифровий фотоапарат має тифтовий або навіть необроблений параметр для цього. Якщо ви хочете зберегти всі маленькі точки, такі як зірки, тоді використовуйте одну з ці). Це також зробить розмір зображення повністю передбачуваним.
Hennes

Відповіді:


22

Тут я пропоную верхню межу розмірів файлів JPEG. Дивіться відповідь Ілмарі Каронен для обговорення більш типових розмірів jpeg.

Місце для зберігання пікселів для 32-бітного растрового зображення 640X480 можна обчислити так (виходячи з цієї відповіді, але виправлене на основі коментаря Ігнасіо Васкеса-Абрамса та цієї відповіді):

Якщо припустити, що до файлу не було застосовано стиснення, існує 307 200 пікселів, що становить 0,3 Мп. Зручний погляд таблиці

Якщо кожен піксель містить 32 біти інформації, то

  1. 307 200 * 32 = 9 830 400 біт інформації
  2. Розділіть на 8 біт, щоб стати байтним значенням
  3. 9,830,400 / 8 = 1228800 байт (Або 1,17 Мб)

Це розмір нестисненого растрового зображення, і тому він повинен бути верхньою межею для розміру файлу jpeg (Насправді, оскільки формат JPEG використовує стиснення , ваші зображення повинні бути значно меншими, особливо зважаючи на те, що ви фотографуєте ніч небо, яке, на мою думку, містить багато чорного кольору.

Що стосується вашої конкретної проблеми, то навіть використовуючи цю верхню межу, 100 зображень - це лише 117 Мбайт, і це вже давно, коли я бачив, що карта пам'яті складає всього 128 Мб. Я підозрюю, що будь-яка наявна на даний момент карта пам'яті буде достатньою ємністю для задоволення ваших потреб.

Мабуть, питання щодо максимального розміру файлу jpeg підлягає певній дискусії. Ця відповідь на переповнення стека пропонує максимально теоретичний розмір 20,25 байт на піксель або 5,9 Мбайт у вашому випадку, але створення зображення такого розміру вимагає навмисного неправильного використання схеми стиснення формату jpeg, тому вкрай малоймовірно, що ви коли-небудь бачили таке річ, вироблена камерою.


1
На жаль, навіть значення нестисненого растрового зображення трохи знижене, оскільки воно передбачає пакування. Розпакована растрова карта використовує 32 біти на піксель (з причин вирівнювання ), збільшуючи розмір файлу на 33%.
Ігнасіо Васкес-Абрамс

Спасибі @ IgnacioVazquez-Abrams Це те, що я вважаю, що прийнята відповідь є правильною.
ForeverWintr

1
@ IgnacioVazquez-Abrams - "Вирівнювання" - це атрибут, який диктує процесор (а не носій інформації), і зручний, коли дані в оперативній пам’яті для обробки. Для цілей зберігання 32-бітове вирівнювання слів не є необхідністю і, безумовно, зайвою. Упаковка даних - це звичайна операція до запису на зберігання, особливо для певної економії 25%. Я бачив цифрові камери, які зберігають кожен піксель рівно в 3 байти для необробленого формату.
тирса

1
"... безумовно, марнотратність". У наш час. Багато місяців тому це вважалося функцією збереження циклу (не потрібно вирівнювати навантаження, враховуючи, скільки часу це займе).
Ігнасіо Васкес-Абрамс

3
На практиці, хоча деякі системи можуть зберігати дані RGB-зображення як 4 байти на піксель у пам’яті , майже всі формати файлів зображень використовують максимум 3 байти на піксель (за винятком випадків, коли в четвертому байті є власне альфа-канал. Дивіться мою відповідь нижче.
Ільмарі Каронен

35

Для перевірки дозвольте експериментально перевірити аналіз ForeverWintr .

Найгіршим видом вхідного зображення для стиснення JPEG (або будь-якого стиснення, насправді) є рівномірно випадковий RGB-шум, який теоретично є нестислимим. Тож дозвольте мені створити деякі за допомогою інструментів netpbm :

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

Равномірно випадковий RGB-шум, формат PNG без втрат
(Равномірно випадковий RGB-шум, формат PNG без втрат, 903 кб)

Примітка (березень 2017 р.): Я досить впевнений, що зображення вище було у форматі PNG, коли я вперше написав цю відповідь і завантажив її ще у 2013 році. (Навіть є коментар щодо управління кольором нижче, що це сильно передбачає це.) На жаль, це було б здається, що він був мовчки перетворений в JPEG в якийсь момент, що робить візуальне порівняння тут марним.

Я спробував перезавантажити нове тестове зображення PNG, але, мабуть, воно вражає довільну межу розміру файлу PNG в imgur і автоматично перетворюється на JPEG. Я не впевнений, чи є спосіб вирішення цієї проблеми, але принаймні, якщо у вас є доступ до вікна Linux, ви завжди можете запустити задані команди для створення власних тестових зображень. У будь-якому випадку, окрім запобігання прямого візуального порівняння якості стиснення, це жодним чином не скасовує аналіз нижче.

Гаразд, тому нестиснений файл PPM має 640 × 480 × 3 = 921 600 байт, плюс 15 байт для мінімального заголовка PPM, як і очікувалося. Намагання стиснути його без втрат у форматі PNG просто призводить до збільшення розміру на 2157 байт, імовірно, зайнятих заголовками та метаданими PNG і, можливо, деякою незначною неефективністю в алгоритмі стиснення, що намагається стиснути несжиттєві дані.

(Так, це 3 байта на піксель, а не 4, і навіть формат PPM, що приблизно так само просто , як графічний формат може отримати, не дурний досить , щоб зберігати даремний четвертий байт на піксель на диску Там. Може бути якийсь - то перевагу робити це в пам'яті з міркувань вирівнювання, особливо якщо вам також потрібно зберегти альфа-канал, але ці причини не застосовуються під час запису зображення у файл.)

Гаразд, що робити з JPEG? Спробуємо спершу звести до мінімуму втрати на стиснення (якість = 100, відсутність підсвічування кольоровості, DCT з плаваючою точкою). На жаль, pnmtojpegкерівництво не чітко пояснює, як встановити всі відповідні параметри (конкретно, -sampleпараметр вказаний у розділі "Параметри для майстрів", який просто посилається на файл у документації на libjpeg), тому я перетворять його в натомість GIMP. Отриманий файл виглядає приблизно так:

897249  rnd.jpg

JPEG-шум, стиснений у форматі REG, якість = 100, без підсвічування кольоровості
(JPEG-шум, стиснений RGB, якість = 100, відсутність підсистеми кольоровості, 876 кб)

Що, як воно може бути меншим? Хіба я просто не сказав, що чистий шум був нестимлим? Ну, справа в тому, що навіть при максимальній якості, звичайне стиснення JPEG не зовсім збиткове. Повторно відкривши зображення в GIMP і порівнявши його з оригіналом, можна побачити, що деякі пікселі змінили свої значення кольорів на один або два кроки (з 256). Це пікселі, де алгоритм стиснення JPEG "обдурив" і трохи відкинув сюди, ще туди, де він оцінив, що зміни не будуть помітні. Дійсно, для людського ока, що не допомагає, результат досить не відрізняється від оригіналу, але ці відкинуті біти дійсно збільшують зменшення розміру файлу навіть після врахування заголовка та кодування накладних даних.

Так що це була максимальна якість; як щодо більш типових налаштувань, як-от за pnmtojpegзамовчуванням (якість = 75, включена підсистема)? Давайте спробуємо:

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

JPEG-шум, стиснений RGB, якість = 75, підсвідомість кольоровості
(JPEG-шум, стиснений RGB, якість = 75, підсистема кольоровості, 184 кб)

Нічого, від 901 до 184 kb! Це досить агресивне стиснення, і ви можете точно визначити різницю, якщо порівнювати зображення. Більшість це через підсистему кольоровості, яка в основному просто викидає 75% кольорових (відтінків / насиченості) даних. Спробувавши це в GIMP з відключеною підсистемою, дається файл 350 618 байт, який все ще виглядає (як мінімум для людського ока) досить близьким до оригіналу навіть при збільшенні.

У будь-якому разі, сенс всього цього полягає в тому, щоб продемонструвати, що, якими б галасливими не були фотографії вашого нічного неба, і якою б високою якістю ви не обрали, просто немає способу, щоб файл JPEG 640 × 480 міг отримати значно більше 900 кб. (Ну, якщо ваша камера не додала до неї багатомегабайтний кольоровий профіль Exif або щось не менш дурне, тобто.) І якщо ви використовуєте більш типові налаштування стиснення JPEG, максимальний правдоподібний розмір файлу знижується приблизно до 200 кб або близько того .


4
теоретично нестислимий лише для стиснення без втрат, правда?
Даніель Бек

1
@DanielBeck: Правильно. Очевидно, ви можете стискати будь-які дані скільки завгодно, якщо хочете просто викинути їх частини. (Це в основному те, що робить стиснення JPEG, воно просто намагається зробити це таким чином, щоб втрачені частини не були помітні для людського ока, а те, що залишилося, може бути зашифровано компактно. Шум все ще важкий випадок для цього, оскільки єдине, що навіть алгоритм стиснення
збитків

Можливо, це тільки я, але друге зображення виглядає яскравіше, ніж перше.
Bogdacutu

@Bogdacutu: Це не повинно, хоча завжди можливо, що ваш веб-переглядач може робити щось дивне з керуванням кольором тощо. Спробуйте завантажити їх як у графічному редакторі, так і порівнявши значення кольорів.
Ільмарі Каронен

Приємний запис @Ilmari.
ForeverWintr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.