从手机上传时图像旋转 90 度? PHP

Posted

技术标签:

【中文标题】从手机上传时图像旋转 90 度? PHP【英文标题】:Image rotating 90 degrees when uploaded from mobile? PHP 【发布时间】:2015-11-23 04:30:19 【问题描述】:

我有一个网站,用户可以从手机上传照片,但所有从手机上传的照片在上传时都向左显示 90 度。直播网站是www.uneraportoj.com。我现在的问题是exeif,但我尝试使用插件但无法正常工作。建议提供任何帮助。

分享脚本代码为:

 <?php

    include_once('help.php');

    if(isset($_POST['submit']))    
        $title = $_POST['title'];
        $content = $_POST['content'];
        $posted = $_POST['posted'];
        $date = date("Y-m-d H:i:s");
        $ip = $_SERVER["REMOTE_ADDR"];
        $rand = rand(1,1000000);

        if(empty($title))
            echo "Titulli eshte bosh.";
        else if(empty($content))
            echo "Permbajtja eshte bosh.";
        else if(empty($_FILES['image']['name']))
            echo "Imazhi eshte bosh.";
        else if (
                ($_FILES['image']['type'] == 'image/gif') 
                || ($_FILES['image']['type'] == 'image/jpeg') 
                || ($_FILES['image']['type'] == 'image/pjpeg') 
                || ($_FILES['image']['type'] == 'image/png') 
                && ($_FILES['image']['size'] < 200000)
                )

                    $part = $rand.'_'.$_FILES['image']['name'];

                    if ($_FILES["image"]["error"] > 0) 
                        echo "return code" . $_FILES['image']['error'];

                        //Code from plugin start
                        if($_FILES['image'])
                            // If the image is jpg and has orientation data, make sure we orientate correctly before uploading
                            if($image->exif('Orientation'))
                                $image = orientate($image, $image->exif('Orientation'));
                        

                    else if(move_uploaded_file($_FILES['image']['tmp_name'],'images/'. $part.''))

                        if(empty($posted))
                            $posted = 'Anonim';
                        

                        $sql = "INSERT INTO ***(title, content, date, image, posted, ip) VALUES (:title, :content, :date, :image, :posted, :ip)";
                        $query = $db->prepare($sql);
                        $results = $query->execute(array(
                            ':title' => htmlentities ($title),
                            ':content' => htmlentities ($content),
                            ':date' => $date,
                            ':image' => $part,
                            ':posted' => htmlentities ($posted),
                            ':ip' => $ip
                        ));
                        echo "<div id='ok'>Lajmi u raportua me sukses. Kontrollojeni <a href='index.php'>ketu</a> .</div>";

                    
                else
                    echo "<div id='ok'>Imazhi nuk eshte i sakte. (Vetem jpg/png)</div>";
                

    
?>

插件代码:

    <?php /**
 * Orientate an image, based on its exif rotation state
 * 
 * @param  Intervention\Image\Image $image
 * @param  integer $orientation Image exif orientation
 * @return Intervention\Image\Image
 */

 $image = $_FILES['image'];

function orientate($image, $orientation)

    switch ($orientation) 

        // 888888
        // 88    
        // 8888  
        // 88    
        // 88    
        case 1:
            return $image;

        // 888888
        //     88
        //   8888
        //     88
        //     88
        case 2:
            return $image->flip('h');


        //     88
        //     88
        //   8888
        //     88
        // 888888
        case 3:
            return $image->rotate(180);

        // 88    
        // 88    
        // 8888  
        // 88
        // 888888
        case 4:
            return $image->rotate(180)->flip('h');

        // 8888888888
        // 88  88    
        // 88        
        case 5:
            return $image->rotate(-90)->flip('h');

        // 88        
        // 88  88    
        // 8888888888
        case 6:
            return $image->rotate(-90);

        //         88
        //     88  88
        // 8888888888
        case 7:
            return $image->rotate(-90)->flip('v');

        // 8888888888
        //     88  88
        //         88
        case 8:
            return $image->rotate(90);

        default:
            return $image;
    

?>

【问题讨论】:

我需要提一下,您应该在所有 $_POST 数据上使用 htmlspecialchars(),例如$title = htmlspecialchars($_POST['title']); 正如你现在所拥有的那样,你正面临着巨大的安全威胁。 【参考方案1】:

我发现这个 youtube 视频对使用 exif 数据的图像方向非常有帮助 看看这个 https://www.youtube.com/watch?v=HjHSgGFqAtE

print 'exif orientation';

$original_filename = 'car1.jpg';
$exif_data = exif_read_data($original_filename);

// displays exif data
// print '<pre>';
// print_r($exif_data);
// print '<pre>';


$orientation = orientation($exif_data);
$degrees = orientation_flag($orientation);
print '<pre>';
print_r($orientation);
print '</pre>';

print '<pre>';
print_r($degrees);
print '</pre>';

$image_data = imagecreatefromjpeg($original_filename);
$image_rotate = imagerotate($image_data, $degrees, 0);

$rotated_filename = 'rotated_' . $original_filename;
imagejpeg($image_rotate, $rotated_filename);
imagedestroy($image_data);
imagedestroy($image_rotate);


// finds orientation value in exif data
function orientation($exif_data) 
  // search array for orientation
  foreach($exif_data as $key => $val) 
    // print '<pre>';
    // print_r($key);
    // print '<pre>';
    if(strtolower($key) == 'orientation') 
      return $val;
    
  



// gets orientation data and returns degrees needed for rotation
function orientation_flag($orientation) 
 switch($orientation):
  case 1:
    return 0;
  case 8:
    return 90;
  case 3:
    return 180;
  case 6:
    return 270;
  endswitch;
 

?>


 <img src="car1.jpg" />
 <br>
 <img src="rotated_car1.jpg" />

【讨论】:

【参考方案2】:

你的函数调用在 if(error) 语句下,这意味着它只会在出现错误时轮换。在您的图像通过错误检查并将其移动到最终位置后放置它。

                if ($_FILES["image"]["error"] > 0) 
                    echo "return code" . $_FILES['image']['error'];

                else if(move_uploaded_file($_FILES['image']'tmp_name'],'images/'. $part.''))

                    if(file_exists('images/'. $part.''))
                       /* read exif data (returns it as an array) */
                       $exif_read = exif_read_data('images/'. $part.'');

                       /* if exif contains orientation property (some images don't) */
                       if(!empty($exif_read['Orientation']))
                            $orientation_data = $exif_read['Orientation'];
                            $image = orientate($image, $Orientation_data);
                    

编辑:

我复制并粘贴了用于上传图片的确切代码。对于我正在做的事情,我只需要担心方向 3、6 和 8,但如果您认为需要它们,可以添加其余部分。在 imagerotate() 之后使用 PHP 的 imageflip() 函数(阅读如何使用 here)

<?php

require("../db_credentials.php");

if($_FILES['file']['name'])
  $name = htmlspecialchars($_FILES['file']['name']);
  $ext = end((explode(".", $name)));
  $ext = strtolower($ext);

  //if no errors...
  if(!$_FILES['file']['error'])
    //now is the time to modify the future file name and validate the file
    $new_file_name = date('ymdHisu'). ".". $ext;

    if($_FILES['file']['size'] > (6144000))
      $valid_file = false;
      echo 'Oops!  Your file\'s size is to large.';
    
    elseif($ext !== "jpg" && $ext !== "png" && $ext !== "jpeg" && $ext != "gif" && $ext !== "bmp") 
      $valid_file = false;
      echo "Your file must be in jpg, jpeg, png, gif, or bmp formats.";
    
    else
      $valid_file = true;
    

    //if the file has passed the test
    if($valid_file)
      //move it to where we want it to be
      move_uploaded_file($_FILES['file']['tmp_name'], 'images/'.$new_file_name);

      $exif_read = exif_read_data("images/".$new_file_name);
      if(!empty($exif_read['Orientation']))
        $orientation_data = exif_read_data("images/".$new_file_name)['Orientation'];
      
      if(isset($orientation_data) && $orientation_data !== 1)
    $path = "../images/". $new_file_name;
        $buffer = ImageCreateFromJPEG($path);
       $exif = exif_read_data($path);
        if(!empty($exif['Orientation']))
          switch($exif['Orientation'])
            case 8:
              $buffer = imagerotate($buffer,90,0);
              break;
            case 3:
              $buffer = imagerotate($buffer,180,0);
              break;
            case 6:
              $buffer = imagerotate($buffer,-90,0);
              break;
          
          imagejpeg($buffer, $path, 90);
        
      
    
  
  //if there is an error...
  else
  
    //set that to be the returned message
    echo 'Ooops!  Your upload triggered the following error:  '.$_FILES['file']['error'];
  


?>

【讨论】:

您好,我收到以下错误:'致命错误:在第 37 行的 /home/henrimma/public_html/php/shareScript.php 中的非对象上调用成员函数 exif()感谢您的帮助 我第一次错过了。我用我编写和使用的软件中的一些代码更新了我的答案。问题是代码试图调用一个不存在的函数“exif()”。读取exif数据的函数是'exif_read_data()',它将所有数据作为一个数组返回。您可以在php.net/manual/en/book.exif.php 阅读更多相关信息 你有什么问题?它返回什么错误? 我编辑了我的答案并添加了我正在使用的完整代码。 我似乎无法让它为我工作。我们可以互相发送电子邮件,也许您可​​以访问我的网站并尝试解决此问题。谢谢@frostycoles

以上是关于从手机上传时图像旋转 90 度? PHP的主要内容,如果未能解决你的问题,请参考以下文章

使用 GD 将图像旋转 90 度 [关闭]

Ipad上传的图像在asp.net c#中的所有浏览器中显示桌面旋转90度

Android:图片以 -90 度旋转上传到 Firebase

解决ios手机上传竖拍照片旋转90度的问题

上传到 Firebase 时出现图片方向问题

html5图像旋转缩放并上传