使用PHP进行高效图片批量处理与优化技巧详解
一、准备工作
- 在Linux环境下,可以使用包管理器安装:
sudo apt-get install php-gd - 在Windows环境下,需要在PHP配置文件
php.ini中启用extension=php_gd.dll。 - 创建一个PHP文件,写入以下代码并运行:
phpinfo(); - 查看输出信息中是否有GD库的相关信息。
安装GD库:
检查GD库是否安装成功:
二、批量裁剪图片
-
$directory = 'path/to/your/images'; $files = scandir($directory); foreach ($files as $file) { if (in_array(pathinfo($file, PATHINFO_EXTENSION), ['jpg', 'jpeg', 'gif', 'png'])) { $source = $directory . '/' . $file; $destination = $directory . '/cropped_' . $file; cropImage($source, $destination, 100, 100, 300, 300); } }
创建裁剪函数:
function cropImage($source, $destination, $x, $y, $width, $height) {
$info = getimagesize($source);
switch ($info['mime']) {
case 'image/jpeg':
$image = imagecreatefromjpeg($source);
break;
case 'image/gif':
$image = imagecreatefromgif($source);
break;
case 'image/png':
$image = imagecreatefrompng($source);
break;
default:
return false;
}
$croppedImage = imagecrop($image, ['x' => $x, 'y' => $y, 'width' => $width, 'height' => $height]);
if ($croppedImage !== false) {
switch ($info['mime']) {
case 'image/jpeg':
imagejpeg($croppedImage, $destination);
break;
case 'image/gif':
imagegif($croppedImage, $destination);
break;
case 'image/png':
imagepng($croppedImage, $destination);
break;
}
imagedestroy($image);
imagedestroy($croppedImage);
return true;
}
return false;
}
三、批量缩放图片
-
$directory = 'path/to/your/images'; $files = scandir($directory); foreach ($files as $file) { if (in_array(pathinfo($file, PATHINFO_EXTENSION), ['jpg', 'jpeg', 'gif', 'png'])) { $source = $directory . '/' . $file; $destination = $directory . '/resized_' . $file; resizeImage($source, $destination, 500, 500); } }
创建缩放函数:
function resizeImage($source, $destination, $width, $height, $quality = 90) {
$info = getimagesize($source);
switch ($info['mime']) {
case 'image/jpeg':
$image = imagecreatefromjpeg($source);
break;
case 'image/gif':
$image = imagecreatefromgif($source);
break;
case 'image/png':
$image = imagecreatefrompng($source);
break;
default:
return false;
}
$newImage = imagescale($image, $width, $height);
if ($newImage !== false) {
switch ($info['mime']) {
case 'image/jpeg':
imagejpeg($newImage, $destination, $quality);
break;
case 'image/gif':
imagegif($newImage, $destination);
break;
case 'image/png':
imagepng($newImage, $destination, round($quality / 10));
break;
}
imagedestroy($image);
imagedestroy($newImage);
return true;
}
return false;
}
四、批量转换图片格式
-
$directory = 'path/to/your/images'; $files = scandir($directory); foreach ($files as $file) { if (in_array(pathinfo($file, PATHINFO_EXTENSION), ['jpg', 'jpeg', 'gif', 'png'])) { $source = $directory . '/' . $file; $destination = $directory . '/' . pathinfo($file, PATHINFO_FILENAME) . '.png'; convertImageFormat($source, $destination, 'png'); } }
创建转换格式函数:
function convertImageFormat($source, $destination, $format) {
$info = getimagesize($source);
switch ($info['mime']) {
case 'image/jpeg':
$image = imagecreatefromjpeg($source);
break;
case 'image/gif':
$image = imagecreatefromgif($source);
break;
case 'image/png':
$image = imagecreatefrompng($source);
break;
default:
return false;
}
switch ($format) {
case 'jpg':
imagejpeg($image, $destination);
break;
case 'gif':
imagegif($image, $destination);
break;
case 'png':
imagepng($image, $destination);
break;
default:
return false;
}
imagedestroy($image);
return true;
}
五、批量添加水印
-
$directory = 'path/to/your/images'; $watermark = 'path/to/your/watermark.png'; $files = scandir($directory); foreach ($files as $file) { if (in_array(pathinfo($file, PATHINFO_EXTENSION), ['jpg', 'jpeg', 'gif', 'png'])) { $source = $directory . '/' . $file; $destination = $directory . '/watermarked_' . $file; addWatermark($source, $destination, $watermark, 'bottom-right'); } }
创建添加水印函数:
function addWatermark($source, $destination, $watermark, $position = 'bottom-right') {
$info = getimagesize($source);
switch ($info['mime']) {
case 'image/jpeg':
$image = imagecreatefromjpeg($source);
break;
case 'image/gif':
$image = imagecreatefromgif($source);
break;
case 'image/png':
$image = imagecreatefrompng($source);
break;
default:
return false;
}
$watermarkInfo = getimagesize($watermark);
switch ($watermarkInfo['mime']) {
case 'image/jpeg':
$watermarkImage = imagecreatefromjpeg($watermark);
break;
case 'image/gif':
$watermarkImage = imagecreatefromgif($watermark);
break;
case 'image/png':
$watermarkImage = imagecreatefrompng($watermark);
break;
default:
return false;
}
$x = $info[0] - $watermarkInfo[0];
$y = $info[1] - $watermarkInfo[1];
switch ($position) {
case 'top-left':
$x = 0;
$y = 0;
break;
case 'top-right':
$x = $info[0] - $watermarkInfo[0];
$y = 0;
break;
case 'bottom-left':
$x = 0;
$y = $info[1] - $watermarkInfo[1];
break;
case 'bottom-right':
$x = $info[0] - $watermarkInfo[0];
$y = $info[1] - $watermarkInfo[1];
break;
}
imagecopy($image, $watermarkImage, $x, $y, 0, 0, $watermarkInfo[0], $watermarkInfo[1]);
switch ($info['mime']) {
case 'image/jpeg':
imagejpeg($image, $destination);
break;
case 'image/gif':
imagegif($image, $destination);
break;
case 'image/png':
imagepng($image, $destination);
break;
}
imagedestroy($image);
imagedestroy($watermarkImage);
return true;
}