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

Другие вопросы по тегам