PHP Imagick - конвертировать изображение в оттенки серого (очень плохой результат)
Я занимался редактированием изображений с помощью PHP, поскольку GD предоставляет меньше функциональных возможностей, я переключился на Imagick.
Одним из процессов является серое изображение. Все прошло нормально (локально в Windows 7, Imagick 2.2.1-dev 6.5.8-7 Q16), пока я не загрузил скрипт на свой сервер веб-хостинга (Linux, Imagick 3.0.1, 6.2.8, 2010-10-20, Q16).
Я пытался изменить качество, но ничего не улучшилось.
$ Img->setImageCompression(Imagick::COMPRESSION_JPEG); $ Img->setImageCompressionQuality(100);
Вот результаты GD, Imagick и Photoshop
Я считаю, что что-то не так с версией 3.0.1. Может кто-нибудь подтвердить это?
Q1: есть ли альтернативный способ конвертировать изображение в оттенки серого с Imagick
?
Q2: возможно ли конвертировать ресурс GD в Imagick? Так что я могу использовать imagefilter($img, IMG_FILTER_GRAYSCALE);
чтобы получить правильный результат, а затем вывод с Imagick.
PS: для Q2 вы можете предложить мне использовать GD для обработки изображения. Но проблема в том, что imagejpeg()
невозможно сохранить изображения с сохраненным разрешением. и это на самом деле причина, по которой я перешел на Imagick.
4 ответа
Это мой любимый способ сделать черно-белое фото в php/imagick: $im = $im->fxImage('intensity');
Это применяет функцию к изображению, где интенсивность равна 0.299*red+0.587*green+0.114*blue
,
Эта формула основана на том, насколько наши глаза более чувствительны к разным цветам, и поэтому разница между этим и "плоским" изображением в градациях серого на самом деле является днем и ночью.
Подробнее здесь:
Зайдите на этот сайт и ознакомьтесь с изображениями операторов Magick, найденными здесь http://www.fmwconcepts.com/imagemagick/
Также зайдите с http://www.fmwconcepts.com/imagemagick/ вы найдете несколько примеров здесь...
function ImagickToGD($imagick){
$tmpfile = tmpfile();
$imagick->writeImage($tmpfile);
return imagecreatefromstring(file_get_contents($tmpfile));
}
Обратите внимание, что эта функция не выполняет никакой очистки (кроме временного файла, который PHP очищает автоматически).
Так, например, ваш код должен выглядеть так:
$img = new Imagick();
// ...
$gd = ImagickToGD($img);
unset($img); // destroy imagick
imagefilter($gd, IMG_FILTER_GRAYSCALE);
imagejpeg($gd, $target_name, 100);
imagedestroy($gd);
Кроме того, я не понял часть о "сохранении разрешения". В этих операциях нет ничего, связанного с разрешением. Я думаю, вы имели в виду сжатие? Если вы хотите полное качество (т.е. без сжатия), просто используйте 100 в качестве значения сжатия (как я сделал).
Это приводит к сохранению существующего качества, поскольку открытие изображения с качеством 70% и сохранение его с качеством 70% фактически снижает конечное качество на 49% (70% из 70%).
function GDToImagickTo($gd){
$tmpfile = tmpfile();
imagepng($tmpfile); // Png is our best image deal:
// lossless compression, transparency etc..
$imagick = new Imagick()
$imagick->readImage($tmpfile);
return $imagick;
}
Вы можете использовать класс изображения, который вы предпочитаете, а затем использовать метод readImageBlob, чтобы отправить его в imagick http://www.php.net/manual/en/imagick.readimageblob.php