php - 我的 Imagick 代码似乎从未调整大小,但仍然产生清晰的图像

标签 php image image-processing imagick lossless-compression

我担心 Imagick 可能不支持清晰的图像调整大小。即使是最好的过滤器也会返回模糊的结果,这些结果低于标准,在我看来甚至是可怕的。

这是我能从 Imagick 中获得的最佳品质: Imagick

使用 TimThumbs 调整大小: TimThumbs

注意到巨大的质量差异了吗?谁能提供 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');

GD

我编译了 php55-imagick 扩展来检查你的代码,首先你拼错了 2 个方法名称,当修复后的结果图像实际上没问题时 setCompression 而不是 setComression

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

Imagick

这是使用showdev评论的正确方法的图像,将图像大小加倍(121K vs 329K),但对我来说没有太大好处

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

Imagick using setImageCompression

关于php - 我的 Imagick 代码似乎从未调整大小,但仍然产生清晰的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26151273/

相关文章:

javascript - 替换 php 代码中的 javascript 变量,其中 php 代码位于 javascript 代码块内

html - 如何在链接后放置图片?

python - 在 Python (PIL) 中读取带有损坏 header 的 JPEG

java - 使用java进行形态学闭运算

opencv - 相机校准期间的不同平面

php - 拦截对定义的 PHP 方法的调用

php - 从数据库获取多个数据(或其他)

Python OpenCV putText() 显示(非ascii、unicode、utf)字符符号

php - MySQL 触发器到 PostgreSql 触发器的转换

html - 在 react 中导入图像有问题