使用 PHP 讀取EXIF資訊來旋轉圖片

由於使用者使用平板、手機上傳後,常常會有圖片不是正擺的問題。
這邊我用PHP來處理這個問題(前端也可以用JS來解決旋轉的文題,不過這邊就不多贅述)

主要核心是以下兩個 functionexif_read_data // 用於讀取 exif 資訊imagerotate // 旋轉圖片

下面是我實作的方式,首先你需要有一張圖片,接著:

  1. 讀取
  2. 旋轉
  3. 寫入// 旋轉圖片
    function rotateImage($path)
    {    
     $exif = exif_read_data($path);    
     $extension = strtolower(pathinfo($path, PATHINFO_EXTENSION));
     
     if (isset($exif['Orientation'])) {
       switch($exif['Orientation']) {        
         case 3:          
           $rotateAngle = 180;          
           break;        
         case 6:          
           $rotateAngle = -90;
           break;        
         case 8:          
           $rotateAngle = 90;          
           break;        
         default:          
           $rotateAngle = 0;          
           break;      
     }
         
     if (in_array($extension, ['jpg', 'jpeg', 'png', 'bmp'])) {        
       $source = $this->createImageFromPath($path, $extension);        
       $rotatedImage = imagerotate($source, $rotateAngle, 0);
           
       $this->saveImageByImageExtenstion($rotatedImage, $path, $extension);      
     }    
    }// 讀取圖片
    function createImageFromPath($path, $extension)
    {    
     $extension = strtolower(pathinfo($path, PATHINFO_EXTENSION));            
     $image = null;
       switch ($extension) {      
         case 'jpg':      
         case 'jpeg':        
           $image = imagecreatefromjpeg($path);        
           break;      
         case 'png':        
           $image = imagecreatefrompng($path);        
           break;      
         case 'bmp':        
           $image = imagecreatefrombmp($path);        
           break;    
       }
       
       return $image;  
    }// 儲存圖片
    function saveImageByImageExtenstion($image, $path, $extension)
    {
     switch ($extension) {
       case ‘jpg’:
       case ‘jpeg’:
         imagejpeg($image, $path, 100);
         break;
       case ‘png’:
         imagepng($image, $path);
         break;
       case ‘bmp’:
         imagewbmp($image, $path);
         break;
       }
    }