2013-10-04 107 views
0

我需要修改此調整大小類,以便透明背景的圖像在上傳和調整大小時保留其透明背景。這個班級將透明背景轉換爲看起來不太好的全黑色。當使用php調整大小時,使透明背景保持透明resize-class.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); 
     } 

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

     private 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); 
      } 
     } 

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

     private 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); 
     } 

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

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

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

     private 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); 
     } 

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

     private 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); 
     } 

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

     private 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); 
     } 


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

    } 
+0

所以你希望我們免費檢查這段代碼嗎?那麼,不要說,這是你的工作 - 閱讀你正在使用的混亂代碼。歡迎回來,當你有一些特定的問題。 – zerkms

+0

我會願意支付幫助。我知道這個課程是公開使用的,修復會讓很多人受益,所以我想我會在這裏發佈它,以防其他人使用同一個課程時有相同的問題。我不完全瞭解如何PHP圖像調整大小的作品,我曾試圖修改代碼之前沒有運氣。 –

回答

0

我在稍後搜索了一下後發現了修復程序。添加該代碼

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); 



    imagealphablending($this->imageResized, false); 
    imagesavealpha($this->imageResized, true); 
    $bg = imagecolorallocatealpha($this->imageResized, 0, 0, 0, 127); 
    imagefilledrectangle($this->imageResized, 0, 0, $optimalWidth, $optimalHeight, $bg); 
    imagecolortransparent($this->imageResized, $bg); 


    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); 
      } 
     } 
0

創建畫布時,這樣我會保留透明度:

private function openImage($file,$sizeX, $sizeY) 
    { 
     // *** 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; 
     } 

     //create canvas:    

     $img = imagecreatetruecolor($sizeX,$sizeY); 


     // preserve transparency` 

     if($extension == "gif" or $extension == "png"){ 

      imagecolortransparent($img, imagecolorallocatealpha($img, 0, 0, 0, 127)); 
      imagealphablending($img, false); 
      imagesavealpha($img, true); 
     } 

     return $img; 
    } 

然後,你的畫布激活了透明度。但前提是擴展可以支持它。 但是,您應該設法像參數一樣傳遞大小。