Java-сжатие изображения без потери качества



У меня есть jpeg-изображение размером 2,1 Мб. Я пытаюсь сжать данные изображения настолько, насколько это возможно. Возможно, ниже 1 Мб. В настоящее время я провел некоторые исследования на эту тему, и я написал некоторый код, чтобы попытаться сжать данные. Я наткнулся на такой ответ:



Https://stackoverflow.com/a/4535883/3011902



На основе этого я преобразовал файл изображения в массив байтов, а затем преобразовал массив байтов в его двоичный эквивалент. Затем я использую run кодирование длины двоичных данных. Это делает размер больше, однако.



Я попытался конвертировать файл в формат png. Но это резко увеличило размер файла; 9 МБ.



Итак, каков лучший способ в Java сжимать и размер файлов изображений без потери качества?

670   1  

1 ответ:

JPEG-это с потерями сжатия изображения оригинального источника изображения. При загрузке JPEG-сжатого изображения оно имеет тот же размер (W x H), что и оригинал, и данные (BPP) на пиксель. - хотя информация уже является искажением / квантованием исходной информации. Это означает, чтотакое же количество данных представляетменьше исходной информации.

Попытка применить сжатие без потерь - будь то PNG или ручная RLE - к восстановленному изображению1 это приведет к большему размеру файла, потому что новое сжатие точно сохранит артефакты и существующие потери информации4. Поскольку JPEG может создавать дополнительный шум, восстановленные данные могут даже сделать применение методов сжатия без потерь менее эффективным.

Чтобы получить наилучший компромисс сжатия / качества, начните с исходной необработанной информации об изображении (RAW, BMP, TIFF); и примените формат сжатия изображения на основе по нужде. это может быть выбор формата без потерь (например, PNG, WEBP) или выбор формата с потерями, например JPEG (который имеет несколько вариантов) с различными настройками сжатия. Если изображение уже является JPEG с потерями, лучшим решением (без уменьшения размера изображения / данных) может быть просто оставить его в покое.

Различные алгоритмы сжатия будут получать различные результаты-включая очевидную потерю качества для форматов с потерями-на основе содержимого изображения. Например, простой RLE2 сжатие будет хорошо работать на изображениях многих больших одноцветных областей, но JPEG будет работать намного лучше на фотографии3.


1 Если применяется общее сжатие (напр. DEFLATE, bzip2) над потоком байтов, который уже представляет хорошо сжатые данные, может быть сохранено несколько процентов пространства. Однако, поскольку изображение Не сначала восстанавливается, в этом случае нет той же инфляции, что и при повторном применении без потерь. сжатие изображения до загруженного изображения "полных данных".

2 среди других своих трюков PNG применяет несколько алгоритмов RLE-стиля и, вероятно, будет так же хорош или лучше, чем ручная реализация. PNG особенно хорошо подходит для иконок, которые обычно относительно просты (по сравнению с фотографиями) и должны быть пиксельно идеальными при восстановлении.

3 частично причина, по которой JPEG может хорошо сжимать фотографии, заключается в том, что он целенаправленно выбрасывает информацию, менее важную для человека зрение и применяет "достаточно хорошие для человеческого восприятия" приближения к сжатым блокам.

4 даже повторное сохранение JPEG-изображения (после модификации) может привести к дальнейшей деградации изображения; есть некоторые работы по "перекодированию JPEG", которые могут быть интересными для чтения.

Comments

    Ничего не найдено.