我已经调整了我找到的代码。它调整.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);
}
答案 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/)这样的无损压缩程序来运行你的一个测试图像,以检查它没有膨胀的重量。