Для перевірки дозвольте експериментально перевірити аналіз 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 без втрат, 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-шум, стиснений RGB, якість = 100, відсутність підсистеми кольоровості, 876 кб)
Що, як воно може бути меншим? Хіба я просто не сказав, що чистий шум був нестимлим? Ну, справа в тому, що навіть при максимальній якості, звичайне стиснення JPEG не зовсім збиткове. Повторно відкривши зображення в GIMP і порівнявши його з оригіналом, можна побачити, що деякі пікселі змінили свої значення кольорів на один або два кроки (з 256). Це пікселі, де алгоритм стиснення JPEG "обдурив" і трохи відкинув сюди, ще туди, де він оцінив, що зміни не будуть помітні. Дійсно, для людського ока, що не допомагає, результат досить не відрізняється від оригіналу, але ці відкинуті біти дійсно збільшують зменшення розміру файлу навіть після врахування заголовка та кодування накладних даних.
Так що це була максимальна якість; як щодо більш типових налаштувань, як-от за pnmtojpeg
замовчуванням (якість = 75, включена підсистема)? Давайте спробуємо:
$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128 rnd2.jpg
(JPEG-шум, стиснений RGB, якість = 75, підсистема кольоровості, 184 кб)
Нічого, від 901 до 184 kb! Це досить агресивне стиснення, і ви можете точно визначити різницю, якщо порівнювати зображення. Більшість це через підсистему кольоровості, яка в основному просто викидає 75% кольорових (відтінків / насиченості) даних. Спробувавши це в GIMP з відключеною підсистемою, дається файл 350 618 байт, який все ще виглядає (як мінімум для людського ока) досить близьким до оригіналу навіть при збільшенні.
У будь-якому разі, сенс всього цього полягає в тому, щоб продемонструвати, що, якими б галасливими не були фотографії вашого нічного неба, і якою б високою якістю ви не обрали, просто немає способу, щоб файл JPEG 640 × 480 міг отримати значно більше 900 кб. (Ну, якщо ваша камера не додала до неї багатомегабайтний кольоровий профіль Exif або щось не менш дурне, тобто.) І якщо ви використовуєте більш типові налаштування стиснення JPEG, максимальний правдоподібний розмір файлу знижується приблизно до 200 кб або близько того .