使用PHP进行高效图片批量处理与优化技巧详解

一、准备工作

    安装GD库

    • 在Linux环境下,可以使用包管理器安装:
      
      sudo apt-get install php-gd
      
    • 在Windows环境下,需要在PHP配置文件php.ini中启用extension=php_gd.dll

    检查GD库是否安装成功

    • 创建一个PHP文件,写入以下代码并运行:
      
      phpinfo();
      
    • 查看输出信息中是否有GD库的相关信息。

二、批量裁剪图片

    创建裁剪函数

    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;
    }
    
  1. $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 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;
    }
    
  1. $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 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;
    }
    
  1. $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 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;
    }
    
  1. $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');
       }
    }
    

六、总结