Amazon S3 - 在 PHP 中使用 GD 调整图像大小,以便上传到 S3


amazon s3 - resizing an image with GD in PHP for upload to S3

所以我在用

PHP 编写 GD 函数以将所有上传的图像大小调整为 150x150 像素之前存储在我的 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.";
}

使用来自 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() 检查您的上传

您可以使用一些 php 库来调整图像大小。参考帖子。尝试以下代码:

//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.";
}

调整类大小.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);
        }

        ## --------------------------------------------------------
    }
?>