在PHP中保留EXIF和旋转图像

在PHP中保留EXIF和旋转图像,php,image,orientation,exif,Php,Image,Orientation,Exif,我的网站托管在共享托管服务器(linux)上,我认为GD imageRotate类对我不可用 基于EXIF方向旋转图像的最佳方式是什么?这是我正在尝试的当前方式,但得到了“调用未定义的方法resize::rotateImage()” 谢谢你的帮助 if ($exif['Orientation']){ $ort = $exif['Orientation'];

我的网站托管在共享托管服务器(linux)上,我认为GD imageRotate类对我不可用

基于EXIF方向旋转图像的最佳方式是什么?这是我正在尝试的当前方式,但得到了“调用未定义的方法resize::rotateImage()”

谢谢你的帮助

if ($exif['Orientation']){  
                                        $ort = $exif['Orientation'];                                            

                                        switch($ort)
                                            {
                                                case 1: // nothing
                                                break;

                                                case 2: // horizontal flip
                                                $resizeObj->flipImage($path,1);
                                                break;

                                                case 3: // 180 rotate left
                                                $resizeObj->rotateImage($path,180);
                                                break;

                                                case 4: // vertical flip
                                                $resizeObj->flipImage($path,2);
                                                break;

                                                case 5: // vertical flip + 90 rotate right
                                                $resizeObj->flipImage($path, 2);
                                                $resizeObj->rotateImage($path, -90);
                                                break;

                                                case 6: // 90 rotate right
                                                $resizeObj->rotateImage($path, -90);
                                                break;

                                                case 7: // horizontal flip + 90 rotate right
                                                $resizeObj->flipImage($path,1);    
                                                $resizeObj->rotateImage($path, -90);
                                                break;

                                                case 8:    // 90 rotate left
                                                $resizeObj->rotateImage($path, 90);
                                                break;
                                            }
                                        }

                    if (($resizeObj->width > 600) || ($resizeObj->height > 600)){

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

                    // *** 3) Save image
                    $resizeObj -> saveImage($path, 95);

                }
调整类大小

  # ========================================================================#
       #
       #  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;
                public $width;
                public $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);
                }


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

            }
    ?>
#========================================================================#
#
#作者:贾罗德·奥伯托
#版本:1.0
#日期:2010年1月17日
#用途:调整大小并保存图像
#需要:需要PHP5,GD库。
#用法示例:
#包括(“classes/resize_class.php”);
#$resizeObj=new resize('images/cars/large/input.jpg');
#$resizeObj->resizeImage(150100,0);
#$resizeObj->saveImage('images/cars/large/output.jpg',100);
#
#
# ========================================================================#
类大小调整
{
//***类变量
私人图像;
公共宽度;
公众高度;;
私有$imageResized;
函数构造($fileName)
{
//***打开文件
$this->image=$this->openImage($fileName);
//***获取宽度和高度
$this->width=imagesx($this->image);
$this->height=imagesy($this->image);
}
## --------------------------------------------------------
私有函数openImage($file)
{
//***获得分机
$extension=strtolower(strrchr($file,'.');
交换机($分机)
{
案例“.jpg”:
大小写“.jpeg”:
$img=@imagecreatefromjpeg($file);
打破
大小写“.gif”:
$img=@imagecreatefromformgif($file);
打破
大小写“.png”:
$img=@imagecreatefrompng($file);
打破
违约:
$img=假;
打破
}
返回$img;
}
## --------------------------------------------------------
公共函数resizeImage($newWidth、$newHeight、$option=“auto”)
{
//***获得最佳宽度和高度-基于$option
$optionArray=$this->getDimensions($newWidth,$newHeight,$option);
$optimizeWidth=$optionArray['optimizeWidth'];
$optimalHeight=$optionArray['optimalHeight'];
//***重采样-创建x、y大小的图像画布
$this->imagesized=imageCreateTureColor($optimizeWidth,$optimizeHeight);
imagecopyresampled($this->imageResized,$this->image,0,0,0,$optimalWidth,$optimalHeight,$this->width,$this->height);
//***如果选项为“裁剪”,则也要裁剪
如果($option=='crop'){
$this->crop($optimalWidth,$optimalHeight,$newWidth,$newHeight);
}
}
## --------------------------------------------------------
私有函数getDimensions($newWidth、$newHeight、$option)
{
交换机($选项)
{
“准确”案例:
$optimalWidth=$newWidth;
$optimalHeight=$newHeight;
打破
“肖像”一案:
$optimalWidth=$this->getSizeByFixedHeight($newHeight);
$optimalHeight=$newHeight;
打破
“景观”案例:
$optimalWidth=$newWidth;
$optimalHeight=$this->getSizeByFixedWidth($newWidth);
打破
“自动”案例:
$optionArray=$this->getSizeByAuto($newWidth,$newHeight);
$optimizeWidth=$optionArray['optimizeWidth'];
$optimalHeight=$optionArray['optimalHeight'];
打破
“作物”案例:
$optionArray=$this->getOptimalCrop($newWidth,$newHeight);
$optimizeWidth=$optionArray['optimizeWidth'];
$optimalHeight=$optionArray['optimalHeight'];
打破
}
返回数组('optimalWidth'=>$optimalWidth,'optimalHeight'=>$optimalHeight);
}
## --------------------------------------------------------
私有函数getSizeByFixedHeight($newHeight)
{
$ratio=$this->width/$this->height;
$newWidth=$newHeight*$ratio;
返回$newWidth;
}
私有函数getSizeByFixedWidth($newWidth)
{
$ratio=$this->height/$this->width;
$newHeight=$newWidth*$ratio;
返回$newHeight;
}
私有函数getSizeByAuto($newWidth,$newHeight)
{
如果($this->height<$this->width)
//***待发布的图像