Просто чтобы проверить, позвольте мне проверить анализ 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), поэтому я преобразую его в ГИМП вместо. Полученный файл выглядит так:
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 кб! Это довольно агрессивное сжатие, и вы можете точно определить разницу, сравнивая изображения. В основном это связано с подвыборкой цветности, которая в основном просто отбрасывает 75% данных о цвете (оттенок / насыщенность). Попытка его в GIMP с отключенной подвыборкой дает файл размером 350 618 байт, который все еще выглядит (по крайней мере, для человеческого глаза) довольно близко к оригиналу даже при увеличении.
В любом случае, смысл всего этого в том, чтобы продемонстрировать, что независимо от того, насколько шумными будут ваши фотографии в ночном небе, и независимо от того, какое высокое качество вы можете выбрать, просто невозможно, чтобы файл JPEG 640 × 480 мог быть значительно больше 900 кб. (Что ж, если ваша камера не подключила к нему мульти-мегабайтный цветовой профиль Exif или что-то такое же глупое, то есть.) И если вы используете более типичные настройки сжатия JPEG, максимальный вероятный размер файла снижается примерно до 200 КБ или около того. ,