2013-10-27 5 views
1

Я пытаюсь изменить размер изображения. Он отлично работает с одним изображением. Но с несколькими изображениями, я должен использовать цикл для получения изображений один за другим. Поэтому я сохраняю класс и его функции в другом файле, чтобы не получить ошибку повторного объявления класса. Итак, у меня есть 3 файла. Один - index.php, One - class.php, а другой - functions.php, все они ниже.Изменение размера изображения в PHP

Я получаю ошибку призыве к неопределенному методу изменения размера :: resizeImage()

Ниже мой код для индекса

<?php 


// *** Include the class 

$tmp = "image1.jpg,image2.jpg"; 

$single=explode(',',$tmp); 
foreach($single as $single){ 

// include_once("class.php"); 
include_once("class.php"); 

// *** 1) Initialise/load image 
$resizeObj = new resize('./images/'.$single.''); 

// *** 2) Resize image (options: exact, portrait, landscape, auto, crop) 
$resizeObj -> resizeImage(420, 290, 'auto'); 

// *** 3) Save image 
$resizeObj -> saveImage('1-'.$single.'', 100); 

} 

?>

А ниже мой класс файл

Class resize 
    { 

     private $image; 
      private $width; 
      private $height; 
     private $imageResized; 
      } 

И ее е это функции файл

<?php 


     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

Я смущен вашим файлом функций. Являются ли эти методы класса вне реального класса? Это не сработает. – Kontrollfreak

+0

Hi kontrollfreak, Ну, я сохранил их в том же файле, что и в файле классов. Но затем я получаю общее предупреждение для всех функций, которые я использую в class.php Предупреждение: ** functionname() ожидает, что параметр 1 будет ресурсом , boolean given ** – user1960856

+0

Использовать include_once ("class.php") перед foreach, будет ли он исправлять вашу проблему? – nut

ответ

1

Пожалуйста, активируйте значение конфигурации php "display_errors" равным true, а затем вы увидите, что вы пытаетесь включить класс изменения размера каждый раз при прохождении цикла.

Включите свой класс и верните свой скрипт и повторите попытку.

0

Я думаю, вы должны поместить все функции внутри файла класса

Class resize 
     { 

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

     // All other functions here ... 

     } 
+0

Ну, я сделал. Но тогда я получаю предупреждение за все функции, которые я использую в классе.php – user1960856

+0

Мне не нравится эта часть '$ single = explode (',', $ tmp); foreach ($ single as $ single) 'вы можете изменить его на' $ arrSingle = explode (',', $ tmp); foreach ($ arrSingle как $ single) ', и если это не поможет, пожалуйста,' print_r (explode (',', $ tmp)) '. – electroid

+0

Hi electroid Я изменил на то, что вы предложили, но это тоже не поможет. Также я напечатал этот массив, и он имел оба значения tmp-массива. Я получаю такое же предупреждение для всех функций ** _ functionname() _ ожидает, что параметр 1 будет ресурсом, имеет значение boolean ** – user1960856

0

Сначала я рекомендую вам получить базовое понимание ООП в PHP: PHP: Classes and Objects - Manual

Во-вторых, я ненавижу делать все работа, но здесь это:

<?php 

Class resize 
{ 
    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); 
    } 
} 

Заменить class.php с этим, удалите functions.php и убедитесь, что ваши изображения будут доступны, так как ваш код не будет го строка любых ошибок, если эти файлы не могут быть доступны.

Это быстрое и грязное исправление. Не полагайтесь на это.

+0

Привет, kontrollfreak, Ну, я сохранил функции класса n в том же файле, что и в файле класса. Но тогда я получение общего предупреждения для всех функций, которые я использую в предупреждении class.php: imagesx() ожидает, что параметр 1 будет ресурсом, boolean given..not only imagesx(), но все другие связанные с изображением функции дают такое же предупреждение. Более того, его работа с одним изображением совершенно прекрасна. Таким образом, изображения доступны. расскажите мне об этом предупреждениях. Его волнует меня. – user1960856

Смежные вопросы