Php 我的Imagick代码似乎从来没有调整过大小,仍然可以生成清晰的图像

Php 我的Imagick代码似乎从来没有调整过大小,仍然可以生成清晰的图像,php,image,image-processing,imagick,lossless-compression,Php,Image,Image Processing,Imagick,Lossless Compression,我担心Imagick可能不支持锐利的图像大小调整。即使是最好的过滤器也会返回模糊的结果,这些结果在我的微不足道的意见中是不规则的,甚至是可怕的。 这是我能从Imagick获得的最好品质: 可使用以下方法调整大小: 注意到质量上的巨大差异了吗?有谁能提供一个由Imagick制作的清晰图像的例子吗 下面是用于生成第一幅图像的Imagick代码: function imgSize($imagePath,$imageName,$imageExt,$width,$height,$copy) {

我担心Imagick可能不支持锐利的图像大小调整。即使是最好的过滤器也会返回模糊的结果,这些结果在我的微不足道的意见中是不规则的,甚至是可怕的。 这是我能从Imagick获得的最好品质:

可使用以下方法调整大小:

注意到质量上的巨大差异了吗?有谁能提供一个由Imagick制作的清晰图像的例子吗

下面是用于生成第一幅图像的Imagick代码:

function imgSize($imagePath,$imageName,$imageExt,$width,$height,$copy) {
    $file = "img/".$imageName."-".$width."x".$height.".".$imageExt;
    if (!file_exists($file)) {
        try {
                $image = $imagePath;
                $im = new Imagick();
                $im->pingImage($image);
                $im->readImage($image);
                $im->setImageFormat($imageExt);
                //$im->thumbnailImage($width,$height,true);
                $im->cropThumbnailImage($width,$height);
                $im->resizeImage($width,$height,Imagick::FILTER_LANCZOS,0,false);
                $im->cropThumbnailImage($width,$height);
                if ($imageExt=("jpg"||"JPG")) {
                    $img->setComression(Imagick::COMPRESSION_JPEG);
                    $img->setComressionQuality(100);
                }
                if (!$copy==null) {
                    $draw = new ImagickDraw();
                    $draw->setFont("fpdf/font/Montserrat-Regular.ttf");
                    $draw->setFontSize(35);
                    $draw->setFillColor("Gray");
                    $draw->setFillAlpha(0.5);
                    $draw->setGravity(Imagick::INTERPOLATE_AVERAGE);
                    $im->annotateImage($draw,0,0,-45,$copy);
                }
                $im->writeImage("img/".$imageName."-".$width."x".$height.".".$imageExt);
                $im->destroy();
                return "img/".$imageName."-".$width."x".$height.".".$imageExt;
        }
        catch(Exception $e) { echo $e->getMessage(); }
    }
};

我知道也有类似的问题,但对于这个图像质量问题还没有一个充分的答案。解决Imagick图像质量问题的大多数尝试都是将问题简化为“收缩图像时会得到这样的结果。”但我在本文中提供的TimThumbs图像示例反驳了这一假设。您可以使用PHP缩小图像并获得惊人的效果。

这对我来说似乎更好,我只是将其调整为原始图像的20%。使用GD和100%质量作为JPEG

function resizeImg($filename, $percent, $saveTo) {

    list($width, $height) = getimagesize($filename);
    $newwidth = $width * $percent;
    $newheight = $height * $percent;

    $thumb = imagecreatetruecolor($newwidth, $newheight);
    $source = imagecreatefromjpeg($filename);

    imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
    imagejpeg($thumb, $saveTo, 100);
    imagedestroy($thumb);
}

resizeImg('image.jpg', 0.2, 'image02.jpg');

我已经编译了php55 imagick扩展来检查您的代码,首先您拼写了2个方法名,当修复的结果图像实际上是OK
setCompression
not
setCompression

$im->setCompression(Imagick::COMPRESSION_JPEG);
$im->setCompressionQuality(100);

下面是showdev评论的具有正确方法的图像,图像大小是原来的两倍(121K对329K),但对我来说并没有多大好处

$im->setImageCompression(Imagick::COMPRESSION_JPEG);
$im->setImageCompressionQuality(100);

在指责Imagick在这里犯错之前,您确定您对图像纵横比的计算是正确的吗?@Mr.Concolato如果有问题,我看不出来。上面提供的代码似乎符合互联网上其他人使用的标准。我非常愿意接受这个问题是我自己的。事实上,我更愿意这样做,以便我能更快地修复此问题。:)很公平。只是检查一下。:)我们可以有一个链接到更大的图片,GD更好吗?这可能会有帮助:有趣。我相信TimThumbs使用GD。如果你不介意我问你的GD代码是什么?我明白了。我相信我会为GD重写这个,因为它似乎比Imagick产生更好的结果。然而,我不会将此标记为答案,因为它没有直接解决Imagick,但确实在GD v中提出了一个令人信服的案例。伊玛吉克辩论。似乎Imagick在最重要的一个类别——质量方面存在缺陷。你读过showdev的评论吗?您使用的函数不正确。同时检查@onetrickpony确认使用
setImageCompression
文件大小加倍(121K vs 329K)虽然我看不到图像质量的差异,但将编辑帖子以添加第二个版本。这可能是因为您正在调用cropThumbnailImage(),这也可能会缩放图像。如果您自己正在调整大小,请使用cropImage()