4

我正在使用 PHP 进行一些图像编辑,因为 GD 提供的功能较少,所以我切换到了 Imagick。

其中一个过程是灰度图像。在我将脚本上传到我的网络托管服务器(Linux、Imagick 3.0.1、6.2.8、2010-10-20、问题 16)。

我试图改变质量,但它并没有改善任何东西。

$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

4 回答 4

2

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

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

该公式基于我们的眼睛对不同颜色的敏感程度,因此它与“平面”灰度图像之间的区别实际上是白天和黑夜。

更多细节在这里:

于 2015-12-03T17:19:37.383 回答
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;
}
于 2012-11-25T01:43:04.163 回答
0

请参阅此网站并查看此处找到的图像 Magick 操作员www.rubblewebs.co.uk/imagemagick/

也可以访问www.fmwconcepts.com/imagemagick/你会在这里找到一些例子......

于 2012-11-25T03:56:30.573 回答
0

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

于 2014-04-16T12:32:14.963 回答