【问题标题】:Cropping, resizing, and saving image from file upload or URL in PHP在 PHP 中从文件上传或 URL 中裁剪、调整大小和保存图像
【发布时间】:2013-12-18 11:09:53
【问题描述】:

我正在将图片上传器整合到我的网站中,并且需要以下功能:

  • 通过文件或提供的 URL 从表单中获取图像
  • 裁剪图像由提供的crop_x、crop_y、crop_width和crop_height变量指定
  • 调整图像大小,使裁剪部分具有指定尺寸
  • 将图像保存到特定文件夹

我不太确定该怎么做,因为到目前为止我的 PHP 经验是 mysql 数据处理。任何帮助表示赞赏。谢谢。

【问题讨论】:

    标签: php image upload resize crop


    【解决方案1】:
    <?php
    
       # ========================================================================#
       #
       #  Author:    Jarrod Oberto
       #  Version:   1.0
       #  Date:      17-Jan-10
       #  Purpose:   Resizes and saves image
       #  Requires : Requires PHP5, GD library.
       #  Usage Example:
       #                     include("classes/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);
                }
    
    
                ## --------------------------------------------------------
    
            }
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 2014-02-10
      • 2015-02-22
      • 2010-11-03
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多