Можно ли определить уровень качества JPEG?

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

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

мои вопросы:

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

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

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

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

я использую библиотеку GD2 на PHP, если это имеет какое-либо значение

10 ответов


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

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

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

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


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

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

identify -format '%Q' yourimage.jpg

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

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


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

$> identify -format '%Q' filename.jpg
   92%

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

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

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

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

есть и другие параметры, такие как подвыборка, метод dct и т. д.

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

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

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


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

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

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

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


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

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

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

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


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

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

identify -format '%f: %Q' *

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


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


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


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