【问题标题】:image upload script to make thumbnails and getting unwanted posterized images图像上传脚本以制作缩略图并获取不需要的分色图像
【发布时间】:2010-10-29 18:11:49
【问题描述】:

我有一个图片上传脚本,它生成的缩略图是分色的,质量很差。

我不确定脚本中的哪个特定函数会改变这一点,所以我把整个事情都贴出来了。

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

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

【问题讨论】:

  • 编写此代码的人将获得“有史以来最无用的评论”奖!

标签: php


【解决方案1】:

并没有真正阅读您的代码,而是扫描了它以寻找典型的陷阱:

不要使用 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
          }
    

    【讨论】:

    • 我删除了那些部分,但现在后处理更糟了。是否存在可以使用或不存在的质量设置?
    • imagejpeg 默认质量为 75(满分 100),这不会给您带来极端的伪像。你能举一个这样的“海报化”缩略图的例子吗?
    猜你喜欢
    • 2013-09-05
    • 2017-01-27
    • 1970-01-01
    • 2014-02-16
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2017-06-02
    相关资源
    最近更新 更多