2017-04-10 111 views
0

我嘗試調整大小並使用PHP(GD)旋轉圖像,但當圖像旋轉時,它會在右側添加黑色邊框。GD PHP旋轉圖像黑色邊框

爲例圖像(以前調整&旋轉): Exemple

爲例圖像(調整&旋轉): Exemple of black border add

這裏是我的代碼:

$image = $_FILES["file"]["name"]; 
    $uploadedfile = $_FILES['file']['tmp_name']; 

    if ($image) { 

     $filename = stripslashes($_FILES['file']['name']); 

     $i = strrpos($filename,"."); 
     $l = strlen($filename) - $i; 
     $ext = substr($filename,$i+1,$l); 

     $extension = strtolower($ext); 

     if (($extension != "jpg") && ($extension != "jpeg") 
      && ($extension != "png") && ($extension != "gif")) { 

      echo ' Unknown Image extension '; 
      $errors=1; 
     } 

     else { 
      $size=filesize($_FILES['file']['tmp_name']); 

      if($extension=="jpg" || $extension=="jpeg") { 
       $uploadedfile = $_FILES['file']['tmp_name']; 
       $src = imagecreatefromjpeg($uploadedfile); 
      } 
      else if($extension=="png") { 
       $uploadedfile = $_FILES['file']['tmp_name']; 
       $src = imagecreatefrompng($uploadedfile); 
      } 
      else { 
       $src = imagecreatefromgif($uploadedfile); 
      } 

      $max_width = 175; 
      $max_height = 100; 

      $size=GetImageSize($uploadedfile); 

      $width_ratio = ($size[0]/$max_width); 
      $height_ratio = ($size[1]/$max_height); 

      if($width_ratio >=$height_ratio) 
      { 
       $ratio = $width_ratio; 
      } 
      else 
      { 
       $ratio = $height_ratio; 
      } 

      $new_width = ($size[0]/$ratio); 
      $new_height = ($size[1]/$ratio); 
      $tmp=imagecreatetruecolor($new_width,$new_height); 

      if(function_exists("exif_read_data")){ 
       $exif = @exif_read_data($uploadedfile); 

       $rotateImg = imagerotate($src,0,0); 

       if(!empty($exif['Orientation'])) { 
        switch($exif['Orientation']) { 
        case 8: 
         $rotateImg = imagerotate($src,90,0); 
         break; 
        case 3: 
         $rotateImg = imagerotate($src,180,0); 
         break; 
        case 6: 
         $rotateImg = imagerotate($src,-90,0); 
         break; 
        } 
       } 
      } 

      imagecopyresampled($tmp,$rotateImg,0,0,0,0,($new_width-1),($new_height-1),$size[0],$size[1]); 

      $filename = sha1(basename($_FILES['file']['name'])); 
      $path = dirname(__FILE__)."/../files/pictures/".$filename; 

      imagejpeg($tmp,$path,100); 

      imagedestroy($src); 
      imagedestroy($rotateImg); 
      imagedestroy($tmp); 


     } 
    } 

我嘗試了一些修改重刑像這樣的職位的答案: - A border appears when rotating image with gd + php - PHP - Rotate image with GD gives black borders - Why when i rotate the image black borders appear? PHP GD

但沒有什麼工作。

請大家幫幫我。如果EXIF數據指示旋轉是必要的,因爲在旋轉後的高度和寬度的值仍然視爲相同發生

謝謝你

+0

請在編輯您的問題以在調整大小和旋轉之前包含圖像,以便可以測試您的代碼。 – timclutton

+1

調整大小和旋轉之前的圖像添加;) – user1269586

+0

您的代碼[適用於我](https://i.stack.imgur.com/KRFQo.jpg),您使用的是哪個版本的PHP? – timclutton

回答

1

問題。由於圖像已被旋轉,因此這些值應相互切換。

旋轉需要先完成,而不是最後完成,因此請將旋轉代碼移到所有比率計算之上(在聲明$size之後)。你需要保持90/-90度旋轉拍攝地點的軌道:

$rotated = false; 
if (!empty($exif['Orientation'])) { 
    switch ($exif['Orientation']) { 
     case 8: 
      $src = imagerotate($src, 90, 0); 
      $rotated = true; 
      break; 
     case 3: 
      $src = imagerotate($src, 180, 0); 
      break; 
     case 6: 
      $src = imagerotate($src, -90, 0); 
      $rotated = true; 
      break; 
    } 
} 

現在,你需要「翻轉」的值,如果方向發生了變化:

if ($rotated) { 
    $width = $size[1]; 
    $height = $size[0]; 
} else { 
    $width = $size[0]; 
    $height = $size[1]; 
} 

在休息的代碼將$size[0]的實例替換爲$width$size[1]以及$height以修復計算。

您也可以將...($new_width-1),($new_height-1)...改爲...$new_width, $new_height...以使調整大小的圖像正確匹配,否則在結果圖像的右側和底部會出現1px黑色邊框。

+1

非常感謝你<3 – user1269586