2015-03-02 158 views
0

以下脚本旋转人像图像。我如何改变它以保持方向(不旋转,只是调整大小)?PHP图像调整大小脚本从iPhone摄像头上传旋转图像

更新 该脚本仅在使用相机上传iPhone时旋转肖像图像。从库中上传的iPhone上传的肖像图像不会旋转,上传到桌面上的肖像图像不会旋转。

预览之前上传 Preview before upload

图像尺寸调整后,如果上述从iPhone照相机上传的预览图像(参见PHP和下方类) enter image description here

图像尺寸调整后,如果预览上面的图像是从iPhone库上传(与上述相同的方式拍摄的) enter image description here

PHP

include("classes/resize.class.php"); 
// *** 1) Initialise/load image 
$resizeObj = new resize($fileLocation); 
$resizeObj -> resizeImage(320, 320, 'crop'); 
$resizeObj -> saveImage($fileLocationSq, 100); 

<?php 


     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); 
        return 'ok'; 
       } 
      } 

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

      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

“orientation”是什么意思?你不想旋转?不要使用脚本。 – 2015-03-02 19:42:11

+0

@KIKOSoftware正确,我不想旋转。 “不要使用脚本”,我确实想要缩放图像....这就是为什么我使用脚本.... – Joseph 2015-03-02 19:46:04

+0

我没有看到任何代码将执行图像旋转。我也不确定你的意思是轮流。请添加一些图片作为例子。 – alfallouji 2015-03-02 19:51:53

回答

2

图像可以有关于方向(=横向或纵向)的额外信息。请参阅:

http://www.impulseadventure.com/photo/exif-orientation.html

这可以解释你的问题。如果你看一下:

http://php.net/manual/en/function.imagecreatefromjpeg.php

然后你可以在评论中发现这样的:

此功能不兑现EXIF方向数据。 使用EXIF旋转的图片将在 由imagecreatefromjpeg()处理后以原始方向显示。下面是一个函数,用于在支持EXIF方向数据的同时创建来自JPEG的图像 。

你怎么能为它纠正:

function imagecreatefromjpegexif($filename) 
{ 
    $img = imagecreatefromjpeg($filename); 
    $exif = exif_read_data($filename); 
    if ($img && $exif && isset($exif['Orientation'])) 
    { 
     $ort = $exif['Orientation']; 

     if ($ort == 6 || $ort == 5) 
      $img = imagerotate($img, 270, null); 
     if ($ort == 3 || $ort == 4) 
      $img = imagerotate($img, 180, null); 
     if ($ort == 8 || $ort == 7) 
      $img = imagerotate($img, 90, null); 

     if ($ort == 5 || $ort == 4 || $ort == 7) 
      imageflip($img, IMG_FLIP_HORIZONTAL); 
    } 
    return $img; 
} 
0

KIKO软件的答案是很不错的,但我想作一个小小的除了它。 exif_read_data在所有机器上并不总是可用,所以最好在使用前检查它是否可用。此外,它会产生一些不必要的输出,所以最好用@加上:

if(function_exists('exif_read_data')) 
    { 
     $exif = @exif_read_data($filename); 
    } 
    else 
    { 
     return $img; 
    }