JPEG / PNG大小调整中的数据丢失

时间:2014-03-18 17:16:15

标签: php image

我已经调整了我找到的代码。它调整.jpg和.png图像的大小,并维护alpha图层。

然而,当我调整图像大小时,文件大小的减少远远超出我的预期。这对我来说不是问题,因为我无法看到任何退化或数据丢失。

导致文件大量压缩的原因是什么,如果我需要,我该如何避免?

function thumbnail($image, $width, $height, $target) {

if($image[0] != "/") { // Decide where to look for the image if a full path is not given
    if(!isset($_SERVER["HTTP_REFERER"])) { // Try to find image if accessed directly from this script in a browser
        $image = $_SERVER["DOCUMENT_ROOT"].implode("/", (explode('/', $_SERVER["PHP_SELF"], -1)))."/".$image;
    } else {
        $image = implode("/", (explode('/', $_SERVER["HTTP_REFERER"], -1)))."/".$image;
    }
} else {
    $image = $_SERVER["DOCUMENT_ROOT"].$image;
}
$image_properties = getimagesize($image);
$image_width = $image_properties[0];
$image_height = $image_properties[1];
$image_ratio = $image_width / $image_height;
$type = $image_properties["mime"];

if(!$width && !$height) {
    $width = $image_width;
    $height = $image_height;
}
if(!$width) {
    $width = round($height * $image_ratio);
}
if(!$height) {
    $height = round($width / $image_ratio);
}

if($type == "image/jpeg") {
    header('Content-type: image/jpeg');
    $thumb = imagecreatefromjpeg($image);
} elseif($type == "image/png") {
    header('Content-type: image/png');
    $thumb = imagecreatefrompng($image);
} else {
    return false;
}

$temp_image = imagecreatetruecolor($width, $height);
imagealphablending($temp_image, false);
imagesavealpha($temp_image,true);
$transparent = imagecolorallocatealpha($temp_image, 255, 255, 255, 127);
imagefilledrectangle($temp_image, 0, 0, $nWidth, $nHeight, $transparent);
imagecopyresampled($temp_image, $thumb, 0, 0, 0, 0, $width, $height, $image_width, $image_height);
//$thumbnail = imagecreatetruecolor($width, $height);
//imagecopyresampled($thumbnail, $temp_image, 0, 0, 0, 0, $width, $height, $width, $height);
if($type == "image/jpeg") {
    imagejpeg($temp_image, 'img/'.$target.'.jpg');
} else {
    imagepng($temp_image,'img/'.$target.'.png');
}



imagedestroy($temp_image);
//imagedestroy($thumbnail);

}

1 个答案:

答案 0 :(得分:1)

正如showdev所评论的,imagejpeg()imagepng()都接受图像质量的第三个可选参数。对于imagejpeg(),它从0到100运行,默认为75),对于imagepng(),它从0到9,默认为6。

此外,对于~2.4Mpx图像,4.4Mb是一个非常大的尺寸。它可能包含大量的元数据,当你使用PHP的GD库进行imagecopyresampled()时,大多数元数据就像Photoshop缩略图一样。

你还应该通过像JStrip(http://davidcrowell.com/jstrip/)这样的无损压缩程序来运行你的一个测试图像,以检查它没有膨胀的重量。