скрипт загрузки изображений для создания миниатюр и получения нежелательных постерных изображений - PullRequest
1 голос
/ 01 ноября 2009

У меня есть сценарий загрузки изображения, и его эскизы постерированы и имеют низкое качество.

Я не уверен, какая конкретная функция в сценарии изменяет это, так что плохо публиковать все это.

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 ]

2 голосов
/ 01 ноября 2009

На самом деле не читал ваш код, но проверил его на типичные ошибки:

Не используйте imagecopyresized ().

Вместо этого используйте imagecopyresampled ()

2 голосов
/ 01 ноября 2009

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
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...