2009-11-01 19 views
1

我有一个图像上传脚本,其产生posterid和质量差的缩略图。图像上传脚本,使缩略图和获取不需要的张贴图像

我不确定脚本中的哪个特定函数会改变这个,所以生病发布整个事情。

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>"; 
} 

任何想法我可以改变,以改善图片的质量,以防止他们posterized?

+2

谁写这段代码的人得到了“最没用的评论自从”大奖! – Thomas 2009-11-01 15:49:21

回答

2

没有真正读懂你的代码,胸部扫描,其为典型的疑难杂症:

不要使用imagecopyresized()。

相反,使用imagecopyresampled()

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 
     } 
+0

我删除了这些部分,但现在分版更糟。有没有可能使用的质量设置或? – mrpatg 2009-11-01 15:54:38

+0

'imagejpeg'默认为质量75(满分为100),这不应该给你带来极端的神器。你能举一个这样的“posterized”缩略图的例子吗? – Thomas 2009-11-01 16:41:33

相关问题