首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP Imagick JPEG优化

PHP Imagick JPEG优化
EN

Stack Overflow用户
提问于 2015-03-21 00:19:52
回答 1查看 11.9K关注 0票数 12

我使用PHP Imagick在运行时调整图像的大小。该网站有一个图片上传功能,我们不能相信用户会使用网页友好的JPEGs,因为在mass-import期间有许多35MB的图片,甚至有几个像13MB一样大。每一张图片都会变成一个缩略图(200x200),当从列表视图转到详细视图时,只会显示一张图片,所以性能并不是什么大问题,尽管我们不能把它完全抛在一边。到目前为止,我们正在做的是:

代码语言:javascript
复制
$iMagick = new Imagick($file);
$iMagick->setImageResolution(72,72);
$iMagick->resampleImage(72,72,imagick::FILTER_UNDEFINED,1);
$geometry = $iMagick->getImageGeometry();
if ($geometry['height'] > 1920 || $geometry['width'] > 1080) {
    $iMagick->scaleImage(1920, 0);
    if($geometry['height'] > $resizeHeight) {
        $iMagick->scaleImage(0, 1080);
    }
}
$iMagick->setImageCompression(Imagick::COMPRESSION_JPEG);
$iMagick->setImageCompressionQuality($compression);
$iMagick->writeImage($file);
$Imagick->clear();

附注:我刚刚意识到我的条件逻辑中关于高/宽的缺陷,所以暂时忽略它。我将很快编辑该问题,以反映正确的条件比较。对于那些没有注意到它的人来说,它会将所有图像缩放到1920 wide,即使它应该是缩放高度,然后在缩放之后,它会将其缩小到1080 height

我用来测试的镜像最初是一个3MB 2398×2400镜像。将其缩放到1079x1080会生成1.5MB图像,然后以高质量的70添加JPEG压缩会将其缩小到750KB。使用kraken.io可以将图像压缩到略低于60KB。由于这个脚本需要在运行时优化图像,我还能对它做什么吗?

我已经阅读了使用libjpeg的建议,但我找不到任何关于它启用哪些功能的文档,也找不到任何强制Imagick具体使用它的方法。我甚至不确定Imagick是否已经在使用它了。

编辑:解决方案

代码语言:javascript
复制
function itm_optimizeImage($file, $compression = 70, $maxDimensions = ['width' => null, 'height' => null]) {
    $save = false;
    $fi = new finfo(FILEINFO_MIME);
    $mime = explode(';', $fi->file($file));
    switch ($mime[0]) {
        // possible to optimize other image types in the future
        case 'image/jpeg':
            try {
                $iMagick = new Imagick($file);
                if ($iMagick->getImageCompressionQuality() > $compression) {
                    $file = !itm_compressJPEG($file, $compression, $maxDimensions, $iMagick);
                }
            }
            catch (Exception $e) {
                error_log(__FUNCTION__ . " $path/$file failed: " . $e->getMessage());
                return false;
            }
            if ($file) {
                $pathParts = pathinfo($file);
                rename($file, $pathParts['dirname'] . '/' . $pathParts['filename'] . '.large.' . $pathParts['extension']);
                $iMagick->writeImage($file);
            }
            $iMagick->clear();
            break;
    }

    return $file;
}

function itm_compressJPEG($file, $compression = 70, $maxDimensions = ['width' => null, 'height' => null], &$iMagick = null) {
    try {
        $iMagickCreated = true;
        if ($iMagick) $iMagickCreated = false;
        else $iMagick = new Imagick($file);

        $iMagick->setImageResolution(72,72);
        $iMagick->resampleImage(72,72,imagick::FILTER_UNDEFINED,1);
        $geometry = $iMagick->getImageGeometry();
        if (($geometry['width'] / $maxDimensions['width']) > ($geometry['height'] / $maxDimensions['height'])) {
            // scale by width
            $iMagick->scaleImage($maxDimensions['width'], 0);
        } else {
            // scale by height
            $iMagick->scaleImage(0, $maxDimensions['height']);
        }
        $iMagick->setImageCompression(Imagick::COMPRESSION_JPEG);
        $iMagick->setImageCompressionQuality($compression);
        $iMagick->setImageFormat('jpg');
        $iMagick->stripImage();

        if ($iMagickCreated) {
            $pathParts = pathinfo($file);
            rename($file, $pathParts['dirname'] . '/' . $pathParts['filename'] . '.large.' . $pathParts['extension']);
            $iMagick->writeImage($file);
            $Imagick->clear();
        }
        return $file;
    }
    catch (Exception $e) {
        error_log(__FUNCTION__ . " $path/$file failed: " . $e->getMessage());
        return false;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-24 03:00:23

将setImageCompressionQuality的值设置为70,并在其后面添加以下两行。

代码语言:javascript
复制
$image->setImageFormat("jpg");
$image->stripImage();

这将大大减小图像的大小。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29171248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档