2010-06-16 96 views
1

我使用下面的代碼片段來裁剪圖像?爲什麼我的圖像在裁剪時會拉伸?

function crop($width,$height) { 
     $new_image = imagecreatetruecolor($width, $height); 
     imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $this->getWidth(), $this->getHeight(), $width, $height); 
     $this->image = $new_image; 
    } 

這裏,$this->image是原始圖像和$this->getWidth()保持$this->getHeight()圖片,其中作爲$width$height,是作物區的原始尺寸。

但由於某種原因,裁剪圖像被調整大小(我們幾乎可以說它是調整大小)。

如何解決這個問題?

回答

4

那麼,問題是給出源維度。給整個圖像的尺寸將重新調整大小而不是裁剪。

這應該解決的問題

function crop($width,$height) { 
     $new_image = imagecreatetruecolor($width, $height); 
     imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $width, $height); 
     $this->image = $new_image; 
    } 
+0

也看看http://911-need-code-help.blogspot.com.br/2009/04/crop-to-fit-image-using -aspphp。 html – 2012-06-09 02:45:04

-2

這是imagecopyresampled的作用:它重新調整圖像,並且不裁剪。嘗試使用imagecopy。

+2

不,它不是。 'imagecopy'和'imagecopyresampled'以同樣的方式工作。它們之間的區別在於,'imagecopy'只是根據移動向上或向下「縮放」像素。 「imagecopyresampled」在調整大小時插值像素值(因此它使「平滑」和更好看的圖像)。但是兩者都會裁切和/或調整圖像大小... – ircmaxell 2010-06-16 13:08:53

0

是的,我有上傳的圖片剪裁的解決方案和無澱粉 調整,請根據這一步驟:

第1步:你犯了一個新的index.php文件。

<html> 
    <body> 
     <form action="image_upload.php" method="POST" enctype="multipart/form-data"> 
    <input type="file" name="image" /> 
    <input type="submit"/> 
</form> 
    </body> 
</html> 

步驟2:然後使一個新的文件resize.php

<?php 

     Class resize 
     { 
      // *** Class variables 
      private $image; 
      private $width; 
      private $height; 
      private $imageResized; 

      function __construct($fileName) 
      { 

       // *** Open up the file 
       $this->image = $this->openImage($fileName); 

       // *** Get width and height 
       $this->width = imagesx($this->image); 
       $this->height = imagesy($this->image); 
      } 

      ## -------------------------------------------------------- 
      public static function openImage($file) 
      { 


       // *** Get extension 
       $extension = strtolower(strrchr($file, '.')); 

       switch($extension) 
       { 
        case '.jpg': 
        case '.jpeg': 
         $img = @imagecreatefromjpeg($file); 
         break; 
        case '.gif': 
         $img = @imagecreatefromgif($file); 
         break; 
        case '.png': 
         $img = @imagecreatefrompng($file); 
         break; 
        default: 
         $img = false; 
         break; 
       } 

       return $img; 
      } 

      ## -------------------------------------------------------- 

      public function resizeImage($newWidth, $newHeight, $option="auto") 
      { 
       // *** Get optimal width and height - based on $option 
       $optionArray = $this->getDimensions($newWidth, $newHeight, $option); 

       $optimalWidth = $optionArray['optimalWidth']; 
       $optimalHeight = $optionArray['optimalHeight']; 


       // *** Resample - create image canvas of x, y size 
       $this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight); 
       imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height); 


       // *** if option is 'crop', then crop too 
       if ($option == 'crop') { 
        $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight); 
       } 
      } 

      ## -------------------------------------------------------- 

      public function getDimensions($newWidth, $newHeight, $option) 
      { 
       switch ($option) 
       { 
        case 'exact': 
         $optimalWidth = $newWidth; 
         $optimalHeight= $newHeight; 
         break; 
        case 'portrait': 
         $optimalWidth = $this->getSizeByFixedHeight($newHeight); 
         $optimalHeight= $newHeight; 
         break; 
        case 'landscape': 
         $optimalWidth = $newWidth; 
         $optimalHeight= $this->getSizeByFixedWidth($newWidth); 
         break; 
        case 'auto': 
         $optionArray = $this->getSizeByAuto($newWidth, $newHeight); 
         $optimalWidth = $optionArray['optimalWidth']; 
         $optimalHeight = $optionArray['optimalHeight']; 
         break; 
        case 'crop': 
         $optionArray = $this->getOptimalCrop($newWidth, $newHeight); 
         $optimalWidth = $optionArray['optimalWidth']; 
         $optimalHeight = $optionArray['optimalHeight']; 
         break; 
       } 
       return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); 
      } 

      ## -------------------------------------------------------- 

      public static function getSizeByFixedHeight($newHeight) 
      { 
       $ratio = $this->width/$this->height; 
       $newWidth = $newHeight * $ratio; 
       return $newWidth; 
      } 

      public static function getSizeByFixedWidth($newWidth) 
      { 
       $ratio = $this->height/$this->width; 
       $newHeight = $newWidth * $ratio; 
       return $newHeight; 
      } 

      public static function getSizeByAuto($newWidth, $newHeight) 
      { 
       if ($this->height < $this->width) 
       // *** Image to be resized is wider (landscape) 
       { 
        $optimalWidth = $newWidth; 
        $optimalHeight= $this->getSizeByFixedWidth($newWidth); 
       } 
       elseif ($this->height > $this->width) 
       // *** Image to be resized is taller (portrait) 
       { 
        $optimalWidth = $this->getSizeByFixedHeight($newHeight); 
        $optimalHeight= $newHeight; 
       } 
       else 
       // *** Image to be resizerd is a square 
       { 
        if ($newHeight < $newWidth) { 
         $optimalWidth = $newWidth; 
         $optimalHeight= $this->getSizeByFixedWidth($newWidth); 
        } else if ($newHeight > $newWidth) { 
         $optimalWidth = $this->getSizeByFixedHeight($newHeight); 
         $optimalHeight= $newHeight; 
        } else { 
         // *** Sqaure being resized to a square 
         $optimalWidth = $newWidth; 
         $optimalHeight= $newHeight; 
        } 
       } 

       return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); 
      } 

      ## -------------------------------------------------------- 

      public function getOptimalCrop($newWidth, $newHeight) 
      { 

       $heightRatio = $this->height/$newHeight; 
       $widthRatio = $this->width/$newWidth; 

       if ($heightRatio < $widthRatio) { 
        $optimalRatio = $heightRatio; 
       } else { 
        $optimalRatio = $widthRatio; 
       } 

       $optimalHeight = $this->height/$optimalRatio; 
       $optimalWidth = $this->width/$optimalRatio; 

       return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); 
      } 

      ## -------------------------------------------------------- 

      public function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight) 
      { 
       // *** Find center - this will be used for the crop 
       $cropStartX = ($optimalWidth/2) - ($newWidth /2); 
       $cropStartY = ($optimalHeight/ 2) - ($newHeight/2); 

       $crop = $this->imageResized; 
       //imagedestroy($this->imageResized); 

       // *** Now crop from center to exact requested size 
       $this->imageResized = imagecreatetruecolor($newWidth , $newHeight); 
       imagecopyresampled($this->imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight); 
      } 

      ## -------------------------------------------------------- 

      public function saveImage($savePath, $imageQuality="100") 
      { 
       // *** Get extension 
       $extension = strrchr($savePath, '.'); 
       $extension = strtolower($extension); 

       switch($extension) 
       { 
        case '.jpg': 
        case '.jpeg': 
         if (imagetypes() & IMG_JPG) { 
          imagejpeg($this->imageResized, $savePath, $imageQuality); 
         } 
         break; 

        case '.gif': 
         if (imagetypes() & IMG_GIF) { 
          imagegif($this->imageResized, $savePath); 
         } 
         break; 

        case '.png': 
         // *** Scale quality from 0-100 to 0-9 
         $scaleQuality = round(($imageQuality/100) * 9); 

         // *** Invert quality setting as 0 is best, not 9 
         $invertScaleQuality = 9 - $scaleQuality; 

         if (imagetypes() & IMG_PNG) { 
          imagepng($this->imageResized, $savePath, $invertScaleQuality); 
         } 
         break; 

        // ... etc 

        default: 
         // *** No extension - No save. 
         break; 
       } 

       imagedestroy($this->imageResized); 
      } 


      ## -------------------------------------------------------- 

     } 
?> 

步驟3:你也使新的兩頁夾1)圖像和2)image_thumb

步驟4:然後做出後一個新的文件image_upload.php

<?php 
include('resize.php'); 
if(isset($_FILES['image'])){ 

    //set a folder move to orignal images 
    $destinationPath = "image/"; 

    //set a folder move to crop and resizeable images 
    $destinationThumbPath = "image_thumb/"; 

    //uploaded files extension 
    $extension = strtolower(strrchr($_FILES['image']['name'], '.')); 

    //set a new custom name of uploaded file 
    $file_name = "image_".rand('1111','9999').$extension; 

    //move orignal image in Destination Path 
    move_uploaded_file($_FILES['image']['tmp_name'],"image/".$file_name); 

    //set a new thumbnail width 
    $newWidth = 96; 
    //set a new thumbnail height 
    $newHeight = 96; 
    //profile image resize 
    $resizeObj = new resize($destinationPath . $file_name); 
    // *** 2) Resize image (options: exact, portrait, landscape, auto, crop) 
    $resizeObj->resizeImage($newWidth, $newHeight, 'crop'); 

    //crop and resize image save in destination path 
    $resizeObj->saveImage($destinationThumbPath . $file_name, 100); 

} 
?>