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