PHP Imagick - 将图像转换为灰度(非常糟糕的结果)

时间:2012-11-25 01:31:45

标签: php imagick gd2 grayscale

我正在使用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的结果 enter image description here

我认为版本3.0.1出了问题。有人可以确认一下吗?

Q1:是否有另一种方法可以使用Imagick将图像转换为灰度?

Q2:是否可以将GD资源转换为Imagick?所以我可以使用imagefilter($img, IMG_FILTER_GRAYSCALE);来获得正确的结果,然后使用Imagick输出。

ps:对于Q2,你可能会建议我只使用GD来处理图像。但问题是imagejpeg()无法保存保留分辨率的图像。这就是我改用Imagick的原因。

4 个答案:

答案 0 :(得分:1)

这是我在php / imagick中制作B& W照片的首选方式:$im = $im->fxImage('intensity');

将一个函数应用于图像,其中强度等于0.299*red+0.587*green+0.114*blue

这个公式是基于我们的眼睛对不同颜色的敏感程度,以及它与平面之间的区别。灰度图像确实是白天和黑夜。

此处有更多详情:

答案 1 :(得分:0)

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;
}

答案 2 :(得分:0)

请参阅此网站并查看此处www.rubblewebs.co.uk/imagemagick/

找到的Magick操作员图片

同时使用www.fmwconcepts.com/imagemagick/,你会在这里找到一些例子......

答案 3 :(得分:0)

您可以使用您喜欢的图像类,然后使用readImageBlob方法将其发送到imagick http://www.php.net/manual/en/imagick.readimageblob.php