我正在使用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的原因。
答案 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