2012-12-04 80 views
0

我已經編寫了一個腳本來上傳,縮放,重新採樣和保存圖像,以便在我的網站上用作頭像。這適用於JPG和GIF文件,但是當我嘗試上傳PNG文件時,它只是返回一個損壞的圖像文件。我在這裏搜索了一個答案,但沒有找到任何幫助。使用GD從PNG文件中破碎的圖像

  • 是的,我知道MIME類型是正確的。
  • 是的,我知道文件是不是完好
  • 是的,我知道這是「選擇」,「png格式」
  • 沒有,有沒有輸出錯誤或警告的情況下。

這是迄今爲止我已經得到了代碼,或者至少一塊的故障:

if(@$_FILES['newAvatar']['name'] != '') { 
    $filename = 'profpics/' . $_SESSION['id'] . '__' . date("Y_m_d__H_i_s") . '__' . $_FILES['newAvatar']['name']; 
    move_uploaded_file($_FILES['newAvatar']['tmp_name'], $filename); 

    // Kontrollera filändelse för att gd ska veta vilken filtyp att konvertera från. 
    switch(end(explode(".", strtolower($filename)))): 
     case "jpg": 
      $image = imagecreatefromjpeg($filename); 
      break; 
     case "jpeg": 
      $image = imagecreatefromjpeg($filename); 
      break; 
     case "gif": 
      $image = imagecreatefromgif($filename); 
      break; 
     case "png": 
      $image = imagecreatefrompng($filename); 
      break; 
     default: 
      $image = imagecreatefromjpeg($filename); 
    endswitch; 

    // Max slutliga dimensioner 
    $max_width = 200; 
    $max_height = 270; 

    // Nuvarande dimensioner 
    $old_width = imagesx($image); 
    $old_height = imagesy($image); 

    // Beräkna skala 
    $scale = min($max_width/$old_width, $max_height/$old_height); 

    // Sätt nya dimensioner utifrån den beräknade skalan 
    $new_width = ceil($scale*$old_width); 
    $new_height = ceil($scale*$old_height); 

    // Skapa tomt bildobjekt 
    $new = imagecreatetruecolor($new_width, $new_height); 

    // Förminska (troligtvis, annars förstora, men det lär väl aldrig hända) 
    imagecopyresampled($new, $image, 0, 0, 0, 0, $new_width, $new_height, $old_width, $old_height); 

    // Spara 

    // Kontrollera filändelse för att gd ska veta vilken filtyp att spara som. 
    switch(end(explode(".", strtolower($filename)))): 
     case "jpg": 
      imagejpeg($new, $filename, 60); 
      break; 
     case "jpeg": 
      imagejpeg($new, $filename, 60); 
      break; 
     case "gif": 
      imagegif($new, $filename, 60); 
      break; 
     case "png": 
      imagepng($new, $filename, 60); 
      break; 
     default: 
      imagejpeg($new, $filename, 60); 
      break; 
    endswitch; 

    // Förstör objekt 
    imagedestroy($image); 
    imagedestroy($new); 

    $sql = "UPDATE tblprofiles SET strAvatarPath = '" . $filename . "' WHERE userId = " . $_SESSION['id']; 
    mysql_query($sql) or die(mysql_error() . "<br />" . $sql); 

} 
+0

什麼意思破了?你看過嗎?該文件包含什麼內容? –

+0

我發佈了下面的解決方案! –

回答

2

最大可能的質量imagejpg()是100但imagepng()只有9中,那裏有60個,也許你把imagepng和imagejpg搞混了。

+0

是的,我是!我剛剛意識到這一點。不管怎樣,謝謝你! –

+0

不客氣! – mastazi

1

解決辦法很簡單。我剛剛錯過了在imagepng的quialty參數()不應該是一個百分比,但一些介於0和9

imagepng($new, $filename, 6); 
+0

'imagegif'沒有質量領域 – Baba

+1

@Baba:你絕對正確!謝謝你提及! –