Можно ли сказать уровень качества JPEG?
Это действительно вопрос из двух частей, так как я еще не полностью понимаю, как эти вещи работают:
моя ситуация: я пишу веб-приложение, которое позволяет пользователю загружать изображения. Затем мое приложение изменяет размер на что-то отображаемое (например: 640x480-ish) и сохраняет файл для последующего использования.
мои вопросы:
- учитывая произвольный файл JPEG, можно ли сказать, какой уровень качества, чтобы я мог использовать это же качество при сохранении размера изображение?
- это вообще имеет значение?? Я должен сохранять все изображения на достойном уровне (например, 75-80), независимо от исходного качества?
Я не так уверен в этом, потому что, как я понимаю: (давайте возьмем крайний пример), если бы у кого-то было 5-мегапиксельное изображение, сохраненное в качестве 0, оно было бы блочным, как и все. Уменьшив размер изображения до 640x480, блочность будет сглажена и еле-еле менее заметными... пока я не сохранил его с качеством 0 снова...
на другом конце спектра, если бы было изображение, которое было 800x600 с q=0, изменение размера до 640x480 не изменит тот факт, что оно выглядит как полное дерьмо, поэтому сохранение С q=80 было бы избыточным.
Я вообще близко?
я использую библиотеку GD2 на PHP, если это имеет какое-либо значение
10 ответов:
JPEG-это формат с потерями. Каждый раз, когда вы сохраняете одно и то же изображение JPEG, независимо от уровня качества, вы уменьшаете фактическое качество изображения. Поэтому, даже если вы получили уровень качества из файла, вы не можете поддерживать это же качество при сохранении JPEG снова (даже при качестве=100).
вы должны сохранить JPEG в таком высоком качестве, как вы можете себе позволить с точки зрения размера файла. Или используйте формат без потерь, например формат PNG.
файлы JPEG низкого качества не просто становятся более блочными. Вместо этого глубина цвета уменьшается, а детализация участков изображения удаляется. Вы не можете полагаться на более низкое качество изображений, которые являются блочными и выглядят нормально при меньших размерах.
по словам спецификация JFIF. номер качества (0-100) не сохраняется в заголовке изображения, хотя сохраняется горизонтальная и вертикальная плотность пикселей.
вы можете просмотреть уровень сжатия с помощью ImageMagick. Инструкции по загрузке и установке можно найти по адресу официальный сайт.
после установки, выполните следующую команду из командной строки:
identify -format '%Q' yourimage.jpg
и вы должны получить значение от 0 (низкое качество, небольшой размер файла) до 100 (высокое качество, большой размер файла).
для будущих посетителей, проверяя качество данного jpeg, вы можете просто использовать инструмент imagemagick:
$> identify -format '%Q' filename.jpg 92%
алгоритм сжатия Jpeg имеет некоторые параметры, которые влияют на качество полученного изображения.
одним из таких параметров являются таблицы квантования, которые определяют, сколько битов будет использоваться на каждом коэффициенте. Разные программы используют разные таблицы кватизации.
некоторые программы позволяют пользователю установить уровень качества 0-100. Но общего определения этого числа нет. Изображение, сделанное с помощью Photoshop с качеством 60%, занимает 46 КБ, в то время как изображение, сделанное с помощью GIMP занимает всего 26 КБ.
таблицы квантования также различны.
есть и другие параметры, такие как подвыборка, метод dct и т. д.
таким образом, вы не можете описать все из них по одному номеру уровня качества, и вы не можете сравнить качество изображений jpeg по одному номеру. Но вы можете создать такое число, как photoshop или gimp, которое будет описывать компромисс между размером по качеству.
больше информация: http://patrakov.blogspot.com/2008/12/jpeg-quality-is-meaningless-number.html
обычная практика заключается в том, что вы изменяете размер изображения до соответствующего размера и применяете jpeg после этого. В этом случае огромные и средние изображения будут иметь одинаковый размер и качество.
Итак, есть в основном два случая, о которых вы заботитесь:
Если входящее изображение имеет слишком высокое качество, оно может занимать неуместное количество места. Поэтому вы можете, например, уменьшить входящий q=99 до q=85.
Если входящее изображение имеет слишком низкое качество, это может быть пустой тратой места, чтобы повысить его качество. За исключением того, что изображение с большим количеством отброшенных данных не будет волшебным образом занимать больше места когда качество повышается -- блочные изображения будут сжиматься очень хорошо даже при высоких настройках качества. Итак, на мой взгляд, совершенно нормально поднять входящий q=1 до q=85.
из этого я бы подумал, что просто заставить приличную настройку качества-это совершенно приемлемая вещь.
вот формула, которую я нашел, чтобы хорошо работать:
jpg100size (размер его не должен превышать в байтах для 98-100% качества) = width * height / 1.7
jpgxsize = jpg100size*x (x = процент, например 0,65)
таким образом, вы можете использовать их, чтобы узнать статистически, какое качество вашего jpg было сохранено в последний раз. если вы хотите получить его, скажем, 65% качества, и если вы хотите избежать повторной выборки, вы должны сравнить размер первоначально, чтобы убедиться, что это не слишком низко, и только затем уменьшить качество
как уже есть два ответа с помощью
identify
вот этот также выводит имя файла (для сканирования нескольких файлов одновременно):Если вы хотите иметь простой вывод
filename: quality
для использования на нескольких изображений, вы можете использоватьidentify -format '%f: %Q' *
до показать имя файла + сжатие всех файлов в текущем каталоге.
каждое новое сохранение файла еще больше снизит общее качество, используя более высокие значения качества, вы сохраните больше изображения. Независимо от того, какое исходное качество изображения было.
Если вы повторно сохраните JPEG, используя то же программное обеспечение, которое создало его изначально, используя те же настройки, вы обнаружите, что ущерб минимизирован - алгоритм будет стремиться выбросить ту же информацию, которую он выбросил в первый раз. Я не думаю, что есть какой-либо способ узнать, какой уровень был выбран, просто посмотрев на файл; даже если бы вы могли, другое программное обеспечение почти гарантирует разные параметры и округление, что делает совпадение почти невозможным.
Это может быть глупый вопрос, но почему вы заботитесь о контролируем качество документа? Я считаю, что если вы используете ImageMagick для преобразования, он будет управлять качеством JPEG для вас для лучшего эффекта. http://www.php.net/manual/en/intro.imagick.php