2011-03-08 95 views
0

在預覽vkontakte.ru(而不是adv)相同質量的圖片可以實現什麼的幫助下?PHP質量預覽照片

我使用庫GD。

圖像質量VKontakte等:

enter image description here

高質量的照片給我的腳本:

enter image description here

大圖:Link

在所有照片VKontakte等最優質的重7Kb,我的16K ...

我的腳本:

<?php 
    function _makeThumbnail($image, $dest, $ext) 
    { 
     $imageType = exif_imagetype($image); 

     switch ($imageType) 
     { 
      case IMAGETYPE_JPEG: 
       $img = imagecreatefromjpeg($image); 
       break; 
      case IMAGETYPE_PNG: 
       $img = imagecreatefrompng($image); 
       break; 
      case IMAGETYPE_GIF: 
       $img = imagecreatefromgif($image); 
       break; 
      default: 
       throw new Exception('Bad extension'); 
     } 

     $width = imagesx($img); 
     $height = imagesy($img); 

      list($widthX, $heightX) = array('130', '130'); 

      if ($width > $widthX || $height > $heightX) 
      {   
       if ($height > $width) 
       { 
        $ratio = $heightX/$height; 
        $newHeight = $heightX; 
        $newWidth = $width * $ratio; 
       } 
       else 
       { 
        $ratio = $widthX/$width; 
        $newWidth = $widthX; 
        $newHeight = $height * $ratio; 
       } 

       $previewImg = imagecreatetruecolor($newWidth, $newHeight); 

       $palsize = ImageColorsTotal($img); 
       for ($i = 0; $i < $palsize; $i++) 
       { 
        $colors = ImageColorsForIndex($img, $i); 
        ImageColorAllocate($previewImg, $colors['red'], $colors['green'], $colors['blue']); 
       } 

       imagecopyresized($previewImg, $img, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); 

       $name = $dest; 
       switch ($imageType) 
       { 
        case IMAGETYPE_JPEG: 
         imagejpeg($previewImg, $name . '.' . $ext, 100); 
         break; 
        case IMAGETYPE_PNG: 
         imagesavealpha($previewImg, true); 
         imagepng($previewImg, $name . '.' . $ext, 9); 
        case IMAGETYPE_GIF: 
         imagegif($previewImg, $name . '.' . $ext); 
         break; 
        default: 
         throw new Exception(); 
       } 
      } 
     imagedestroy($previewImg); 
     imagedestroy($img); 
    } 

實際需要解決兩個問題。 製作最好的質量,從而縮小預覽的尺寸。

回答

4

使用imagecopyresampled()而不是imagecopyresized()通常可以解決嚴重的問題。

也就是說,GD的JPG壓縮標準並不是很好。就圖像質量和文件大小而言,它遠不如Photoshop的出色過濾器。 ImageMagick傾向於至少略好 - 如果良好的壓縮非常重要,它可能值得一看。

0

@Pekka是正確的,至於第二個問題,您可以使用imagejpeg($img, $filename, $quality)優化縮略圖。

here是一個指南和一些樣本,以幫助你。