如何在PHP中减小图像大小而不失去质量

47

我正在尝试开发一个基于图片的网站。我真的很困惑,哪一种图片类型对于更快的页面加载速度和最佳压缩实践最好。请为我提供有关压缩图像大小的最佳方法的建议。


Jpeg,gif和png图像已经被压缩了。您能否澄清一下? - drew010
4个回答

118

如果您想使用编码本身来缩小大小,可以按照此PHP代码进行操作。

<?php 
function compress($source, $destination, $quality) {

    $info = getimagesize($source);

    if ($info['mime'] == 'image/jpeg') 
        $image = imagecreatefromjpeg($source);

    elseif ($info['mime'] == 'image/gif') 
        $image = imagecreatefromgif($source);

    elseif ($info['mime'] == 'image/png') 
        $image = imagecreatefrompng($source);

    imagejpeg($image, $destination, $quality);

    return $destination;
}

$source_img = 'source.jpg';
$destination_img = 'destination .jpg';

$d = compress($source_img, $destination_img, 90);
?>

$d = compress($source_img, $destination_img, 90);

这只是一个传递源图像(即$source_img)、目标图像($destination_img)和压缩图像所需的质量(即90)的PHP函数。

$info = getimagesize($source);

getimagesize()函数用于查找任何给定图像文件的大小,并返回尺寸以及文件类型。


10
此函数将源图像转换为JPEG格式,忽略GIF动画和PNG透明度。 - nikmauro
为了解决@nikmauro提到的PNG透明度问题,我使用了imagepng而不是imagejpeg。对于JPG文件,当然只需修改if语句以使用适当的函数即可。但是,为了保存透明度,我还需要在输出/保存之前添加以下内容:imagealphablending($image, false); imagesavealpha($image, true);我还必须将$quality除以10才能正常工作,因为imagepng不是从0-100而是从0-9。 - Shaakir
不错的想法。但是有一件事情让我困扰,为什么压缩率要设为90?是否存在一个最小值,当超过这个值时,图像就会失去其“原始性”? - FONGOH MARTIN
1
我不确定为什么,但当我使用这段代码时,图像会被旋转,我该如何防止这种情况发生。它似乎总是逆时针旋转90度。 - MattBlack
排序后,我需要从原始图像中读取exif数据并进行相应的调整。 - MattBlack
很好!这个工作正常,但是我遇到了一个问题。当我通过手机相机上传图片时,有时会将该图像旋转90度。 对此应该怎么办? - rg007891

12
我会选择 jpeg。阅读有关图像大小减小的这篇帖子,并在决定了技术后使用ImageMagick

希望这可以帮助您


10

你可以调整图片大小,然后使用imagejpeg()函数。

不要将100作为imagejpeg()函数的质量参数 - 通常超过90就是画蛇添足,只会得到更大的JPEG文件。对于缩略图,请尝试75并逐渐降低,直到在质量/大小之间取得可接受的平衡。

imagejpeg($tn, $save, 75);

如何将调整大小后的图像移动到特定文件夹? - jafar pinjar

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接