2013-07-19 6 views
4

Я разрешаю пользователям загружать изображения. Тем не менее, я хочу сохранить качество JPEG не более 90%. То, что я планирую сделать, это определить текущее качество: - Если менее 90% не делают ничего - если более 90%, чем использование изображения Магик пережать изображения до 90%Определение качества изображения JPEG

Можно ли это сделать ? Я предпочитаю PHP, но любой язык поможет.

+0

Возможный дубликат [ActionScript 3 Read JPEG quality] (http://stackoverflow.com/questions/2511285/actionscript-3-read-jpeg-quality) –

ответ

6

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% или около того).

Update/Примечание: Настройки качества сжатия я говорю о являются от тестов с libjpeg, очень широко используемой библиотеки JPEG. Значения компрессии Photoshop и другие настройки качества программного обеспечения - это все независимо и не обязательно означают то же самое, что и настройки libjpeg.Идея

Пэдди использования высоты изображения и ширину изображения, чтобы рассчитать приемлемый размер файла разумно:

Вы можете получить изображение высота/ширина примерно так:

list($originalWidth, $originalHeight) = getimagesize($imageFile); 

Мой собственный высоко- качественные фотографии, размещенные в Интернете, например: http://ksathletics.com/2013/wsumbb/nw.jpg обычно сохраняются в соотношении около 200 КБ на мегапиксель.

Так, например, вы можете умножить ширину раз по высоте и делить на 1000000 для вычисления мегапикселей на изображении. Разделите размер файла на 1024 для вычисления KB. Затем разделите полученный KB мегапикселями. Если результат меньше 200 или какое-либо значение, которое вы решаете, тогда вам не нужно его повторно сжимать. В противном случае вы можете повторно сжать его с качеством 85% или любым качеством, которое вы решаете.

+0

На самом деле мои текущие настройки качества составляют 85%, но несколько участников даже говорят, что это уродливо. Поскольку я не архивирую исходное изображение, мне нужно довольно высокое качество (для производных изображений, таких как миниатюры, я использую более низкое качество). Используйте размер/размер, поскольку порог звучит разумно. Я выбираю ваш ответ, потому что это хорошо объяснено. Благодарю. – jcisio

1

Вы не можете гарантировать, что настройка качества сохранена в метаданных JPEG. Это параметр кодировщика, а не атрибут изображения.

Подробнее здесь о estimating JPEG quality

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

+0

Я ценю ваш ответ. Я не решаюсь принять его. Я выбрал Иосифа, потому что он хорошо объяснен в его длинном ответе. Благодарю. – jcisio

5

Whats up? Я столкнулся с той же проблемой с приложением, которое я разрабатываю ... Моя проблема заключается в том, что я извлекаю несколько изображений из случайного сайта, и каждый элемент имеет несколько изображений, я хотел бы показать одно изображение для каждого элемента и принести для пользователя изображение лучшего качества.

Я вышел с этой идеей, его довольно просто, и будет работать на любом языке и любого типа сжатия:

//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 или что-то еще, и это приведет нас к большему зазору или меньшему зазору между несжатым и сжатым изображением.

Также важно упомянуть, что это математическое решение для сравнения, этот метод не вернет на самом деле качество изображения, он ответит на процентное соотношение между несжатыми и сжатыми размерами!

, если вам нужно больше информации, вы можете отправить мне по электронной почте: [email protected]

+0

Блестящий. Спасибо. –

2

Поскольку OP заявил, что он предпочитает PHP, я предлагаю следующее:

$img = new Imagick($filename); 
$quality = $img->getImageCompressionQuality(); 
0

Для тех, кто используем GraphicsMagick вместо ImageMagick, вы можете получить качество JPEG с помощью следующей команды:

gm identify -format '%[JPEG-Quality]' path_to/image_file.jpg 

и в соответствии с документацией http://www.graphicsmagick.org/GraphicsMagick.html#details-format

Пожалуйста, обратите внимание, что JPEG не имеет понятия «качество» и что метрика качества используется, и оценивается с помощью программного обеспечения на основе метрики качества, установленным 6b IJG JPEG. Другие кодеры (например, используемые Adobe Photoshop) используют разные показатели кодирования.

0

Если 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

См. https://tools.ietf.org/html/rfc2435#section-4.2.

Смежные вопросы