图像上传脚本,以制作缩略图和获取不需要的分色图像

时间:2009-11-01 15:43:49

标签: php

我有一个图片上传脚本,以及生成的图片被张贴并且质量很差的缩略图。

我不确定脚本中的哪个特定功能会改变这一点,所以发布了整个事情。

if (isset($_POST['submitted'])) { 

$idir = "images/";   // Path To Images Directory
$tdir = "images/";   // Path To Thumbnails Directory
$twidth = "300";   // Maximum Width For Thumbnail Images
$theight = "100";   // Maximum Height For Thumbnail Images 


if($_FILES["imagefile"]["size"] >= 2120000) {
  echo "Too Big";
  die();
} else {
    $imageData = @getimagesize($_FILES["imagefile"]["tmp_name"]);

    if($imageData === FALSE || !($imageData[2] == IMAGETYPE_GIF || $imageData[2] == IMAGETYPE_JPEG || $imageData[2] == IMAGETYPE_PNG)) {
      echo "Image Must Be GIF, JPG, or PNG";
      die();
    }
}

$url = $_FILES['imagefile']['name'];   // Set $url To Equal The Filename For Later Use
  if ($_FILES['imagefile']['type'] == "image/jpg" || $_FILES['imagefile']['type'] == "image/jpeg" || $_FILES['imagefile']['type'] == "image/pjpeg" || $_FILES['imagefile']['type'] == "image/png" || $_FILES['imagefile']['type'] == "image/gif") {
    $file_ext = strrchr($_FILES['imagefile']['name'], '.');   // Get The File Extention In The Format Of , For Instance, .jpg, .gif or .php

            $saltdate = date( 'U' );
            $saltuser = $_SERVER[REMOTE_ADDR];
            $saltname = md5($saltdate.$saltuser);

        $copy = copy($_FILES['imagefile']['tmp_name'], "$idir" . "$saltname" . "$file_ext");   // Move Image From Temporary Location To Permanent Location
    if ($copy) {   // If The Script Was Able To Copy The Image To It's Permanent Location
      $cfunction = 'imagecreatefromjpeg';      
      if ($_FILES['imagefile']['type'] == "image/png") {
        $cfunction = 'imagecreatefrompng';
      } else if ($_FILES['imagefile']['type'] == "image/gif") {
        $cfunction = 'imagecreatefromgif';
      } 
      $simg = $cfunction("$idir" . "$saltname" . "$file_ext");   // Make A New Temporary Image To Create The Thumbanil From
      $currwidth = imagesx($simg);   // Current Image Width
      $currheight = imagesy($simg);   // Current Image Height
      if ($currheight > $currwidth) {   // If Height Is Greater Than Width
         $zoom = $twidth / $currheight;   // Length Ratio For Width
         $newheight = $theight;   // Height Is Equal To Max Height
         $newwidth = $currwidth * $zoom;   // Creates The New Width
      } else {    // Otherwise, Assume Width Is Greater Than Height (Will Produce Same Result If Width Is Equal To Height)
        $zoom = $twidth / $currwidth;   // Length Ratio For Height
        $newwidth = $twidth;   // Width Is Equal To Max Width
        $newheight = $currheight * $zoom;   // Creates The New Height
      }
      $dimg = imagecreate($newwidth, $newheight);   // Make New Image For Thumbnail
      imagetruecolortopalette($simg, false, 256);   // Create New Color Pallete
      $palsize = ImageColorsTotal($simg);
      for ($i = 0; $i < $palsize; $i++) {   // Counting Colors In The Image
       $colors = ImageColorsForIndex($simg, $i);   // Number Of Colors Used
       ImageColorAllocate($dimg, $colors['red'], $colors['green'], $colors['blue']);   // Tell The Server What Colors This Image Will Use
      }
      imagecopyresized($dimg, $simg, 0, 0, 0, 0, $newwidth, $newheight, $currwidth, $currheight);   // Copy Resized Image To The New Image (So We Can Save It)

                imagejpeg($dimg, "$tdir" . "thumb_" . $saltname . "$file_ext");   // Saving The Image

                        $full = "$saltname" . "$file_ext";
                        $thumb = "thumb_" . "$saltname" . "$file_ext";

      imagedestroy($simg);   // Destroying The Temporary Image
      imagedestroy($dimg);   // Destroying The Other Temporary Image
    } else {

    }
  } else {
  }


echo "<img src=images/$thumb>";
} 

知道我可以改变什么来提高图片的质量以防止它们被分类吗?

2 个答案:

答案 0 :(得分:2)

imagetruecolortopalette($simg, false, 256);将真彩色图像转换为最多256种颜色的调色板图像。由于你之后保存为JPEG,这条线似乎毫无意义。跟随它的for循环。好吧,这整个块,真的:

      imagetruecolortopalette($simg, false, 256);   // Create New Color Pallete
      $palsize = ImageColorsTotal($simg);
      for ($i = 0; $i < $palsize; $i++) {   // Counting Colors In The Image
       $colors = ImageColorsForIndex($simg, $i);   // Number Of Colors Used
       ImageColorAllocate($dimg, $colors['red'], $colors['green'], $colors['blue']);   // Tell The Server What Colors This Image Will Use
      }

答案 1 :(得分:2)

没有真正阅读过你的代码,胸围扫描了它的典型问题:

不要使用imagecopyresized()。

相反,请使用imagecopyresampled()