要使用PHP将图片压缩到指定大小,您可以使用以下方法:
- 使用PHP的GD库或Imagick扩展来读取和操作图片。
- 调整图片的尺寸以减小其大小。
- 使用
imagecopyresampled()
函数来重新采样图片,以保持适当的图像质量。 - 使用
filesize()
函数检查压缩后的文件大小,并根据需要进行调整。
以下是一个使用GD库将图片压缩到指定大小的示例代码:
function compress_image($source, $destination, $quality, $target_size) {
// 获取原始图片尺寸
list($source_width, $source_height, $source_type) = getimagesize($source);
// 根据原始图片类型创建图片资源
switch ($source_type) {
case IMAGETYPE_GIF:
$source_image = imagecreatefromgif($source);
break;
case IMAGETYPE_JPEG:
$source_image = imagecreatefromjpeg($source);
break;
case IMAGETYPE_PNG:
$source_image = imagecreatefrompng($source);
break;
default:
return false;
}
// 计算新的尺寸以保持纵横比
$ratio = min($target_size / $source_width, $target_size / $source_height);
$new_width = intval($source_width * $ratio);
$new_height = intval($source_height * $ratio);
// 创建一个新的空白图片资源
$destination_image = imagecreatetruecolor($new_width, $new_height);
if ($destination_image === false) {
return false;
}
// 保持alpha通道(适用于PNG)
if ($source_type == IMAGETYPE_PNG) {
imagealphablending($destination_image, false);
imagesavealpha($destination_image, true);
$transparent = imagecolorallocatealpha($destination_image, 255, 255, 255, 127);
imagefilledrectangle($destination_image, 0, 0, $new_width, $new_height, $transparent);
}
// 重新采样图片并保存到目标文件
imagecopyresampled($destination_image, $source_image, 0, 0, 0, 0, $new_width, $new_height, $source_width, $source_height);
switch ($source_type) {
case IMAGETYPE_GIF:
imagegif($destination_image, $destination);
break;
case IMAGETYPE_JPEG:
imagejpeg($destination_image, $destination, $quality);
break;
case IMAGETYPE_PNG:
imagepng($destination_image, $destination, 9 - ($quality / 10));
break;
}
// 销毁图片资源
imagedestroy($source_image);
imagedestroy($destination_image);
return $destination;
}
$source = 'path/to/input/image.jpg'; // 输入图片路径
$destination = 'path/to/output/compressed_image.jpg'; // 输出图片路径
$quality = 75; // 图片质量(0-100)
$target_size = 100000; // 目标大小(字节)
$compressed_image = compress_image($source, $destination, $quality, $target_size);
if ($compressed_image !== false) {
echo "Image compressed successfully!";
} else {
echo "Failed to compress image.";
}
请注意,这个示例代码仅适用于JPEG和PNG图片。对于GIF图片,由于它不支持透明度,因此不需要处理alpha通道。此外,这个示例代码没有实现自动调整图片尺寸的功能,而是直接计算新的尺寸以保持纵横比,这可能会导致图片超出目标大小。您可能需要进一步的逻辑来确保压缩后的图片大小不超过指定的目标大小。