Всем привет! Голову уже напрочь сломал Imagick-ом. Мне нужно изменить размер картинки. Все понятно как сделать, но вот вопрос по качеству... Провел исследование с одной картинкой размером 23,2 Кб, после вот этой строки (строк): $img = new Imagick(); $img->readImage(realpath($src)); или $img = new Imagick(realpath($src)); она на выходе после строк: $img->getimageblob(); или $img->writeimage($filename); становиться размером 6,8 Кб. Перепробовал setImageCompression = COMPRESSION_NO и setImageCompressionQuality = 100. Без изменений. Притом, что COMPRESSION_NO, что COMPRESSION_JPEG - качество и размер одинаковый. Хотя библиотека работает в плане изменения размера. В чем может быть проблема? Кто сталкивался с такой ситуацией? Почему так? Почему нельзя работать с оригиналом картинки? Почему Imagick сжимает ее еще в конструкторе? PHP 5.4 и Imagick 3.1.2.
качество при этом меняется? им может тупо оптимизировать изображение удаляя из него всякие превьюшки и эксифы. опять же глядя на размерность выходного изображения он может принимать решение об оптимизации без потери качества. то есть сам факт изменения размера файла изображения еще не говорит о том что изображение стало хуже. и оптимизация отлично работает до некоторого размера изображения. несколько лет назад сравнивал поведение гд и им - им всегда выдавал более красивое изображение при значительно меньшем размере файла. но превьюшки типа 50*50 были по размеру больше чем исходный файл таких же размерностей - тут оптимизатор явно лажал.
Да да... Вот в этом то и проблема - сильно искажает картинку. Я наоборот, рад что сжимает - это отлично! Но вот качество теряет картинка сильно, реально плохо выглядит даже не вооруженным взглядом. Я вот и не знаю, что и делать. Мне качество важно! В итоге мне надо получить туже картинку без потери качества, но изменить размеры.
может быть какой-то баг в расширении. я с ним не знаком ибо пользуюсь консольной версией им. попытка выполнить утилиту convert даст тот же результат?
Не пробовал. А как средствами PHP изменить размеры и вернуть blob image (не сохраняя в файл результат) для дальнейшей работы с ним, подскажите, пожалуйста?
ну средствами пхп это следовательно средствами гд или им. больше вроде для растра ничего и нет. изменить размеры это вы в мануал по инструменту посмотрите. я консольную версию использую и там это делается например так Код (Text): convert from.jpg -resize 100x100^ -quality 80 -interlace Plane to.jpg - вписывает изображение в квадрат со стороной 100. то есть 100 будет бОльшая сторона исходного изображения. качество ставится 80% жпг - от 80 до 100 почти нет заметной глазу разницы кроме кол-ва нулей в размере файла. интерлейс ставится прогрессивный - изображение будет на медленном канале загружаться не сверху вниз а с постепенным приростом качества - сначала мыло, потом четче, еще четче и так далее пока не будет готов весь файл. прогрессивная развертка чуть больше по размеру файла но позволяет не дожидаться загрузки файла - образ различимый человеку готов за 3-4 этапа до конца загрузки. вот еще пример консольной команды Код (Text): convert from.jpg -resize 100x100^ -gravity center -crop 100x100+0+0 -interlace Plane to.jpg сначала приводит изображение к 100 по малой стороне а потом вырезает квадрат 100*100 из середины то есть равномерно отступив по бОльшей стороне. что там в расширении сделали - не смотрел. на консоль ушел еще во времена когда расширение носило экспериментальный характер и падало и мемликалось после каждого обработанного пиксела.
Мои претензии к Imagick сняты . Оказалось, что это сам веб сервер сжимает content image/jpeg до такого состояния. А сам imagick сжимает но не значительно из 23,2 Кб до 20,8 Кб.
Вообщем, проблема была в строке выдачи изображения в браузер imagejpeg($image); По умолчанию, функция исползует качество на 75%. Поставил 100% и все ок. Тема закрыта.