2011-03-08 91 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是一个指南和一些样本,以帮助你。