【问题标题】:PHP imagecopyresampled problem with ratio, resizing and croppingPHP imagecopyresampled 的比例、调整大小和裁剪问题
【发布时间】:2011-05-11 09:03:42
【问题描述】:

好的,所以我正在编写一个图像上传,我们希望将图像强制为 795x440 像素。它们可以调整大小,但必须保持纵横比,这样它们也可以被裁剪。

新图像的尺寸正确,但从原始文件中裁剪的图像比例错误,尝试了一些不同的方法但无法正确。

我现在正在测试的图像,原始文件

http://image.bayimg.com/jaiflaada.jpg

裁剪的结果

http://image.bayimg.com/jaifmaada.jpg

我怎样才能做到这一点,所以图像总是得到最佳尺寸并裁剪其余部分?

list($width, $height) = getimagesize($save_dir);

$prop = (795 / $width);
$height = floor($height * $prop);


$new_image = imagecreatetruecolor(795, 440);

$bgColor = imagecolorallocate($new_image, 255,255,255) or die("Couldn't allocate color");
imagefill($new_image , 0,0 , $bgColor) or die("Couldnt fill with color");


imagecopyresampled($new_image,$source_image,0,0,0,0,795,440,795,$height);


imagejpeg($new_image,$new_directory,100);

【问题讨论】:

    标签: php image crop


    【解决方案1】:

    我做得很简单。使用相同的技术,但是 - 图像始终保持其纵横比。并在目标图像的中心调整大小。

    //创建空图像并用白色填充背景 $thumbnail = imagecreatetruecolor($width, $height); $white = imagecolorallocate($thumbnail, 255, 255, 255); 图像填充($thumbnail, 0, 0, $white); //计算调整大小的图片图片尺寸 $width_ratio = $image_width/$width; $height_ratio = $image_height/$height; //这是关键。目标尺寸将是正确的纵横比。 如果 ($width_ratio>$height_ratio) { $dest_width=$宽度; $dest_height=$image_height/$width_ratio; } 别的{ $dest_width=$image_width/$height_ratio + 2; // 如果 +2px,小图像看起来更好 $dest_height=$高度; } //计算新图像的“中心”图片位置。 $int_width = ($width - $dest_width)/2; $int_height = ($height - $dest_height)/2; imagecopyresampled($thumbnail, $thumb, $int_width, $int_height, 0, 0, $dest_width, $dest_height, $image_width, $image_height);

    【讨论】:

    • 不过,这将永远不会裁剪图像。
    【解决方案2】:

    我就是这样做的:

    public function cropImage($nw, $nh, $source, $stype, $dest) {
        list($w, $h) = getimagesize($source);
    
        switch($stype) {
            case 'gif':
                $simg = imagecreatefromgif($source);
            break;
            case 'jpg':
            case 'jpeg':
                $simg = imagecreatefromjpeg($source);
            break;
            case 'png':
                $simg = imagecreatefrompng($source);
            break;
        }
        $dimg = imagecreatetruecolor($nw, $nh);
        $white = imagecolorallocate($dimg, 255, 255, 255);
        imagefill($dimg, 1, 1, $white);
        $wm = $w/$nw;
        $hm = $h/$nh;
        $h_height = $nh/2;
        $w_height = $nw/2;
    
        if($w > $h) {
             $adjusted_width = $w / $hm;
             $half_width = $adjusted_width / 2;
             $int_width = $half_width - $w_height;
             imagecopyresampled($dimg, $simg, -$int_width, 0, 0, 0, $adjusted_width, $nh, $w, $h);
        } elseif(($w < $h) || ($w == $h)) {
             $adjusted_height = $h / $wm;
             $half_height = $adjusted_height / 2;
             $int_height = $half_height - $h_height;
             imagecopyresampled($dimg,$simg,0,-$int_height,0,0,$nw,$adjusted_height,$w,$h);
        } else {
             imagecopyresampled($dimg,$simg,0,0,0,0,$nw,$nh,$w,$h);
        }       
    
        if(imagejpeg($dimg, $dest, 70))
            return true;
        else
            die("cropImage: error.");
    }
    

    【讨论】:

      【解决方案3】:

      你可以试试这个功能。

      function thumb($file, $save, $width, $height)
          {
              @unlink($save);
      
              if (!$infos = @getimagesize($file)) {
                  return false;
              }
      
              $iWidth = $infos[0];
              $iHeight = $infos[1];
              $iRatioW = $width / $iWidth;
              $iRatioH = $height / $iHeight;
      
              $iNewW = $width;
              $iNewH=($iHeight/$iWidth)*$iNewW;
      
              //$iNewH = $height;
      
      
              //Don't resize images which are smaller than thumbs
              if ($infos[0] < $width && $infos[1] < $height) {
                  $iNewW = $infos[0];
                  $iNewH = $infos[1];
              }
      
              if($infos[2] == 1) {
      
                  $imgA = imagecreatefromgif($file);
                  $imgB = imagecreate($iNewW,$iNewH);
      
                  if(function_exists('imagecolorsforindex') && function_exists('imagecolortransparent')) {
                      $transcolorindex = imagecolortransparent($imgA);
                          //transparent color exists
                          if($transcolorindex >= 0 ) {
                              $transcolor = imagecolorsforindex($imgA, $transcolorindex);
                              $transcolorindex = imagecolorallocate($imgB, $transcolor['red'], $transcolor['green'], $transcolor['blue']);
                              imagefill($imgB, 0, 0, $transcolorindex);
                              imagecolortransparent($imgB, $transcolorindex);
                          //fill white
                          } else {
                              $whitecolorindex = @imagecolorallocate($imgB, 255, 255, 255);
                              imagefill($imgB, 0, 0, $whitecolorindex);
                          }
                  //fill white
                  } else {
                      $whitecolorindex = imagecolorallocate($imgB, 255, 255, 255);
                      imagefill($imgB, 0, 0, $whitecolorindex);
                  }
                  imagecopyresampled($imgB, $imgA, 0, 0, 0, 0, $iNewW, $iNewH, $infos[0], $infos[1]);
                  imagegif($imgB, $save);        
      
              } elseif($infos[2] == 2) {
      
                  $imgA = imagecreatefromjpeg($file);
                  $imgB = imagecreatetruecolor($iNewW,$iNewH);
                  imagecopyresampled($imgB, $imgA, 0, 0, 0, 0, $iNewW, $iNewH, $infos[0], $infos[1]);
                  imagejpeg($imgB, $save);
      
      
              } elseif($infos[2] == 3) {
                  /*
                  * Image is typ png
                  */
                  $imgA = imagecreatefrompng($file);
                  $imgB = imagecreatetruecolor($iNewW, $iNewH);
                  imagealphablending($imgB, false);
                  imagecopyresampled($imgB, $imgA, 0, 0, 0, 0, $iNewW, $iNewH, $infos[0], $infos[1]);
                  imagesavealpha($imgB, true);
                  imagepng($imgB, $save);
      
              } else {
                  return false;
              }
              return true;
          }
      
      thumb($source,$target_full_path,'337','208');
      

      【讨论】:

        猜你喜欢
        • 2013-10-22
        • 1970-01-01
        • 2015-02-01
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        • 2018-09-22
        • 2011-06-05
        • 1970-01-01
        相关资源
        最近更新 更多