Я разрешаю пользователям загружать изображения. Тем не менее, я хочу сохранить качество JPEG не более 90%. То, что я планирую сделать, – это определить текущее качество: – Если менее 90% ничего не делают – если более 90%, чем использование Image Magick для повторного сжатия изображения до 90%
Можно ли это сделать? Я предпочитаю PHP, но любой язык поможет.
paddy правильно, что этот параметр не всегда сохраняется в файле JPEG. Если да, то вы можете использовать identify
от Imagemagick, чтобы читать качество. Например:
$ identify -format '%Q' tornado_ok.jpg
93%
Обновление. Основываясь на ответе на этот вопрос https://superuser.com/questions/62730/how-to-find-the-jpg-quality, я выясню, что, по-видимому, команда
identify
все еще может определить качество путем обратного проектирования квантования таблицы, даже если все изображения EXIF / другие метаданные будут потеряны. Кстати, название вашего вопроса в его нынешнем виде – это возможный дубликат этого вопроса, с которым я связан.Но для меня ваш вопрос имеет свои достоинства, потому что в тексте вашего вопроса вы объясняете, что вы пытаетесь сделать, что больше, чем просто определение качества jpeg. Тем не менее, вы должны, возможно, обновить заголовок, если хотите, чтобы вы считали, что пытаетесь решить более конкретную проблему, чем просто читать качество изображения в формате JPEG.
Если вы не архивируете оригинальные изображения, для использования в сети даже 90% является чрезмерным. 75% были стандартными в прежние времена (деградация была видна только при тесном осмотре между изображениями «бок о бок»), а теперь в дни высокой пропускной способности 85% – это очень качественный вариант. Разница в 5% качества между 90% и 85% практически невидима, но, как правило, сэкономит вам более 30%. Алгоритм JPEG разработан, чтобы начать с устранения информации, которая невидима для восприятия человеком на первых этапах сжатия (выше 80% или около того).
Обновление / примечание: параметры качества сжатия, о которых я говорю, – это тесты с libjpeg, очень широко используемой библиотекой JPEG. Степени сжатия Photoshop и другие параметры качества программного обеспечения являются независимыми и не обязательно означают то же самое, что и настройки libjpeg.
Идея рисования с использованием высоты изображения и ширины изображения для расчета приемлемого размера файла разумна:
Вы можете получить высоту / ширину изображения следующим образом:
list($originalWidth, $originalHeight) = getimagesize($imageFile);
Мои собственные высококачественные фотографии, размещенные в Интернете, например: http://img.ruphp.com/php/nw.jpg , обычно сохраняются в соотношении около 200 КБ на мегапиксель.
Так, например, вы можете умножить ширину по высоте и делить на 1000000 для вычисления мегапикселей на изображении. Разделите размер файла на 1024 для вычисления KB. Затем разделите полученный KB мегапикселями. Если результат меньше 200 или какое-либо значение, которое вы решаете, тогда вам не нужно его повторно сжимать. В противном случае вы можете повторно сжать его с качеством 85% или любым качеством, которое вы решаете.
что происходит? Я столкнулся с той же проблемой с приложением, которое я разрабатываю … Моя проблема заключается в том, что я извлекаю несколько изображений из случайного сайта, и каждый элемент имеет несколько изображений, я хотел бы показать одно изображение для каждого элемента и принести для пользователя изображение лучшего качества.
Я вышел с этой идеей, ее довольно простой и будет работать для любого языка и любого типа сжатия:
//Parameters you will need to retrieve from image $width = 0; $height = 0; $filesize = 0; //Quality answer for your image $quality = (101-(($width*$height)*3)/$filesize);
Я запустил этот алгоритм против упомянутого выше http://fotoforensics.com/tutorial-estq.php и вот результаты:
Filename Width Height Pixels BitmapBytes FileBytes Quality estq-baseline.png 400 300 120000 360000 163250 98,79 estq-90.jpg 400 300 120000 360000 34839 90,67 estq-80.jpg 400 300 120000 360000 24460 86,28 estq-70.jpg 400 300 120000 360000 19882 82,89 estq-25.jpg 400 300 120000 360000 10300 66,05
Основная идея этого алгоритма – сравнить размер, который может достичь изображение, если он написан в растровом виде (без сжатия, 3 байта на пиксель, 3 байта для RGB) до размера, который в настоящее время используется этим изображением. Чем меньше размер изображения, тем выше сжатие, независимо от используемого метода сжатия, а скорее его JPG, PNG или что-то еще, и это приведет нас к большему зазору или меньшему зазору между несжатым и сжатым изображением.
Также важно отметить, что это математическое решение для целей сравнения, этот метод не вернет фактическое качество изображения, он ответит на процентное соотношение между несжатыми и сжатыми размерами!
если вам нужна дополнительная информация, вы можете отправить мне электронное письмо: rafaelkarst@gmail.com
Поскольку ОП заявлял, что предпочитает php, я предлагаю следующее:
$img = new Imagick($filename); $quality = $img->getImageCompressionQuality();
Вы не можете гарантировать, что параметры качества сохраняются в метаданных JPEG. Это параметр кодировщика, а не атрибут изображения.
Подробнее об оценке качества JPEG читайте здесь
Это может иметь смысл просто определить максимальный размер файла. В конце концов, ограничение качества изображения связано с экономией пропускной способности. Поэтому более уместно установить соотношение между размерами изображения и размером файла.
Для тех, кто использует GraphicsMagick вместо ImageMagick, вы можете получить качество JPEG с помощью следующей команды:
gm identify -format '%[JPEG-Quality]' path_to/image_file.jpg
и согласно документации http://www.graphicsmagick.org/GraphicsMagick.html#details-format
Обратите внимание, что JPEG не имеет понятия «качество» и что метрика качества, используемая и оцененная программным обеспечением, основана на метрике качества, установленной IJG JPEG 6b. Другие кодировщики (например, используемые Adobe Photoshop) используют разные показатели кодирования.
Если ваш jpeg был создан с использованием прямого масштабирования стандартных таблиц квантования изображения, а качество 0-100 использовалось на основе формулы Независимой группы JPEG, то, предположив, что у вас есть таблицы квантования яркости в массиве, называемом quantization
(например, PIL Python модуль предоставляет в image.quantization[0]
), то исходное значение может быть получено через:
if quantization[58] <= 100: originalQuality = int(100 - quantization[58] / 2) else: originalQuality = int(5000.0 / 2.5 / quantization[15])
В принципе, значение квантования яркости по умолчанию # 15 равно 40 и # 58 равно 100, поэтому они дают удобные значения для извлечения результатов. Значения IJG составляют от 50 до 5000 / Q
и ниже 50 через 200 - 2 * Q
Если настройка качества меньше 8, это не даст достойных результатов (если quantization[5] == 255
) – в этом случае, возможно, используйте таблицу квантования позиции № 5