Можно ли определить уровень качества JPEG? - PullRequest
61 голосов
/ 08 января 2010

Это действительно вопрос, состоящий из двух частей, поскольку я пока не до конца понимаю, как все это работает:

Моя ситуация: я пишу веб-приложение, которое позволяет пользователю загружать изображение. Мое приложение затем изменяет размер до чего-то отображаемого (например: 640x480-иш) и сохраняет файл для использования позже.

Мои вопросы:

  1. Имеется ли произвольный файл JPEG, можно ли определить уровень качества, чтобы можно было использовать это же качество при сохранении изображения с измененным размером?
  2. Это вообще имеет значение ?? Должен ли я сохранять все изображения на достойном уровне (например, 75-80) независимо от исходного качества?

Я не уверен в этом, потому что, как я понимаю, (давайте рассмотрим крайний пример), если бы кто-то сохранил 5-мегапиксельное изображение с качеством 0, оно было бы блочным как что-либо. Если уменьшить размер изображения до 640x480, блочность будет сглажена и едва * менее заметной ... пока я не сохраню ее с качеством 0 ...

На другом конце спектра, если бы было изображение размером 800x600 с q = 0, изменение размера до 640x480 не изменит тот факт, что это выглядит как полная чушь, поэтому сохранение с q = 80 будет избыточный.

Я даже близко?

Я использую библиотеку GD2 на PHP, если она будет полезна

Ответы [ 10 ]

93 голосов
/ 22 августа 2013

Вы можете просмотреть уровень сжатия с помощью ImageMagick. Инструкции по загрузке и установке можно найти на официальном сайте .

После установки запустите следующую команду из командной строки:

identify -format '%Q' yourimage.jpg

И вы должны получить значение от 0 (низкое качество, небольшой размер файла) до 100 (высокое качество, большой размер файла).

Источник информации

25 голосов
/ 08 января 2010
  1. JPEG - это формат с потерями. Каждый раз, когда вы сохраняете одно и то же изображение в формате JPEG, независимо от уровня качества, вы снижаете реальное качество изображения. Поэтому, даже если вы получили уровень качества из файла, вы не сможете сохранить то же качество при повторном сохранении JPEG (даже при качестве = 100).

  2. Вы должны сохранять JPEG в таком высоком качестве, которое вы можете себе позволить с точки зрения размера файла. Или используйте формат без потерь, такой как PNG.

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

Согласно спецификации JFIF. номер качества (0-100) не сохраняется в заголовке изображения, хотя сохраняется плотность пикселей по горизонтали и вертикали.

10 голосов
/ 02 апреля 2015

Для будущих посетителей, проверяя качество данного JPEG, вы можете просто использовать инструменты imagemagick:

$> identify -format '%Q' filename.jpg
   92%
8 голосов
/ 11 января 2010

Алгоритм сжатия JPEG имеет несколько параметров, которые влияют на качество получаемого изображения.

Одним из таких параметров являются таблицы квантования, которые определяют, сколько битов будет использоваться для каждого коэффициента. Разные программы используют разные таблицы кватирования.

Некоторые программы позволяют пользователю устанавливать уровень качества 0-100. Но нет единого определения этого числа. Изображение, созданное в Photoshop с качеством 60%, занимает 46 КБ, а изображение, созданное в GIMP, - всего 26 КБ.

Таблицы квантования тоже разные.

Существуют и другие параметры, такие как подвыбор, метод dct и т. Д.

Таким образом, вы не можете описать их все по одному номеру уровня качества и не можете сравнить качество изображений JPEG по одному номеру. Но вы можете создать такой номер как фотошоп или gimp, который будет описывать компромисс между размером и качеством.

Дополнительная информация: http://patrakov.blogspot.com/2008/12/jpeg-quality-is-meaningless-number.html

Обычной практикой является изменение размера изображения до соответствующего размера и применение jpeg после этого. В этом случае огромные и средние изображения будут иметь одинаковый размер и качество.

4 голосов
/ 09 мая 2017

Поскольку уже есть два ответа с использованием identify, вот тот, который также выводит имя файла (для сканирования нескольких файлов одновременно) :

Если вы хотите иметь простой вывод filename: quality для использования на нескольких изображениях, вы можете использовать

identify -format '%f: %Q' *

до показать имя файла + сжатие всех файлов в текущем каталоге.

3 голосов
/ 22 октября 2014

Вот формула, которую я нашел, чтобы работать хорошо:

  1. jpg100size (размер не должен превышать в байтах для качества 98-100%) = ширина * высота / 1,7

  2. jpgxsize = jpg100size * x (x = процент, например 0,65)

так, вы можете использовать их, чтобы статистически выяснить, в каком качестве ваш JPG последний раз сохранялся. если вы хотите снизить его до, скажем, 65% качества, и если вы хотите избежать повторной выборки, сначала сравните размер, чтобы убедиться, что он не слишком низкий, и только затем уменьшите качество

3 голосов
/ 11 января 2010

Итак, есть два основных случая, о которых вы заботитесь:

  1. Если качество входящего изображения слишком высокое, оно может занимать неуместное пространство. Следовательно, вы можете, например, уменьшить входящее q = 99 до q = 85.

  2. Если качество входящего изображения слишком низкое, повышение его качества может быть пустой тратой пространства. За исключением того, что изображение, для которого было отброшено большое количество данных, не будет волшебным образом занимать больше места при повышении качества - блочные изображения будут очень хорошо сжиматься даже при высоком качестве настройки. Так что, на мой взгляд, вполне нормально поднять входящий q = 1 до q = 85.

Исходя из этого, я думаю, что просто принудительно установить настройку достойного качества - вполне приемлемая вещь.

2 голосов
/ 08 января 2010

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

1 голос
/ 11 января 2010

Это может быть глупый вопрос, но почему вас беспокоит микроуправление качеством документа? Я считаю, что если вы используете ImageMagick для преобразования, он будет управлять качеством JPEG для вас для лучшего эффекта. http://www.php.net/manual/en/intro.imagick.php

1 голос
/ 08 января 2010

Если вы восстановите JPEG с использованием того же программного обеспечения, которое создавало его изначально, с теми же настройками, вы обнаружите, что ущерб сведен к минимуму - алгоритм будет стремиться выбросить ту же информацию, которую выкинул в первый раз. Я не думаю, что есть какой-либо способ узнать, какой уровень был выбран, просто посмотрев на файл; даже если бы вы могли, другое программное обеспечение почти гарантирует разные параметры и округление, что делает совпадение практически невозможным.

...