2014-04-01 139 views
1

因此,我在编写GD函数的PHP中将存储在我的s3存储区之前将所有上传的图像大小调整为150x150px时遇到了一些麻烦。用PHP在GD中调整图像大小以上传到S3

为了确认,这段代码目前工作,没有调整大小的功能,我似乎无法找到一个简单的GD函数来实现这一点。

会真的感谢一些帮助,所以在此先感谢!

//instantiate the class 
$s3 = new S3(awsAccessKey, awsSecretKey); 

//store our temporary reference to our image 
$activityContent = $_FILES['uploaded']['name']; 
$fileTempName = $_FILES['uploaded']['tmp_name']; 

//Resize the file 



//move the file to S3 
if ($s3->putObjectFile($fileTempName, "spartadev", $activityContent, S3::ACL_PUBLIC_READ)) 
{ 
    echo "Success! 
} 
else 
{ 
    echo "Something went wrong while uploading your file... sorry."; 
} 

回答

5

使用来自imagecopyresampled()

还是这里的一些例子是完整的代码,你通过:

$new_width = 150; 
$new_height = 150; 
$image_p = imagecreatetruecolor($new_width, $new_height); 
$image = imagecreatefromstring(file_get_contents($fileTempName)); 
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, imagesx($image), imagesy($image)); 

您可能希望保存到一个新的临时文件(的tempnam()是有用的这里将会用putObjectFile()稍后上传:

$newFielName = tempnam(null,null); // take a llok at the tempnam and adjust parameters if needed 
imagepng($image_p, $newFielName, 9); // use $newFielName in putObjectFile() 

另外,别忘了在脚本中检查你的上传与is_uploaded_file()

+0

好极了!那么插入$ fileTempName的图像时是否需要使用$ image变量? – user2656127

+0

谢谢,效果很好:) – user2656127

+0

我的下一个任务是接受jpeg,jpg和png :) – user2656127

1

你可以使用一些php库来调整图像大小。参考post。尝试下面的代码:

//instantiate the class 
$s3 = new S3(awsAccessKey, awsSecretKey); 

//store our temporary reference to our image 
$activityContent = $_FILES['uploaded']['name']; 

//Resize the file 
// *** Include the class 
include("resize-class.php"); 

// *** 1) Initialise/load image 
$resizeObj = new resize($_FILES['files']['temp_name']); 

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

$fileTempName = PATH_TO_FOLDER.'new_file_name.jpg'; 

// *** 3) Save image 
$resizeObj -> saveImage($fileTempName, 1000); 



//move the file to S3 
if ($s3->putObjectFile($fileTempName, "spartadev", $activityContent, S3::ACL_PUBLIC_READ)) 
{ 
echo "Success! "; 
} 
else 
{ 
echo "Something went wrong while uploading your file... sorry."; 
} 

调整大小,class.php

# ========================================================================# 
    # Requires : Requires PHP5, GD library. 
    # Usage Example: 
    #      include("resize_class.php"); 
    #      $resizeObj = new resize('images/cars/large/input.jpg'); 
    #      $resizeObj -> resizeImage(150, 100, 0); 
    #      $resizeObj -> saveImage('images/cars/large/output.jpg', 100); 
    # ========================================================================# 


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


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

    } 
?>