在iOS图像旋转输入捕获

问题描述:

我挣扎着我的PHP形式。我想通过输入捕捉功能上传图像。但是在iOS设备上捕获img后,图像会旋转。我发现了大量关于exif的文章,但是notihing为我工作。因此,我在下面粘贴我的代码,并且希望寻求帮助,以便如何将代码旋转到代码的其余部分。 (我不知道该怎么做。)Thx兄弟寻求帮助。或者也许有任何建议? 代码来实现:在iOS图像旋转输入捕获

fileReader.onloadend = function() { 

var exif = EXIF.readFromBinaryFile(new BinaryFile(this.result)); 

switch(exif.Orientation){ 

    case 8: 
     ctx.rotate(90*Math.PI/180); 
     break; 
    case 3: 
     ctx.rotate(180*Math.PI/180); 
     break; 
    case 6: 
     ctx.rotate(-90*Math.PI/180); 
     break; 


}}; 

休息:

if (isset($_POST['submit'])) { 
    if (empty($_POST['title']) or empty($_POST['shop']) or empty($_FILES['image']) or empty($_POST['price'])) { 
     echo "All fields must be filled"; 
    } 
    else { 
     $userID = $_POST['userID']; 
     $title = $_POST['title']; 
     $price = $_POST['price']; 
     $price_before = $_POST['price_before']; 
     $town = $_POST['town']; 
     $shop = $_POST['shop']; 

     if(empty($_POST['price_before'])){ 
      $price_before = null; 
     } 
     if(empty($_POST['cut'])){ 
      $pcut = null; 
     } 
     if (isset($_FILES['image'])) { 
      $errors = array(); 
      $file_name = $_FILES['image']['name']; 
      $file_size = $_FILES['image']['size']; 
      $file_tmp = $_FILES['image']['tmp_name']; 
      $file_type = $_FILES['image']['type']; 
      $file_ext = strtolower(end(explode('.', $_FILES['image']['name']))); 
      $expensions = array("jpeg", "jpg", "png"); 
      if (in_array($file_ext, $expensions) === false) { 
       $errors[] = "extension not allowed, please choose a JPEG or PNG file."; 
      } 
      if ($file_size > 8097152) { 
       $errors[] = 'File size must be less than 8 MB'; 
      } 
      if (empty($errors) == true) { 
       session_start(); 
       $hour = date("H"); 
       $min = date("i"); 
       $sec = date("s"); 
       $day = date("d"); 
       $month = date("m"); 
       $year = date("Y"); 

       $url = "../pic/".$file_name.".".$file_ext; 

       $file_name = md5(uniqid()); 



       move_uploaded_file($file_tmp, "../pic/".$file_name.".".$file_ext); 

       $upload = "INSERT INTO item (userID, title, price, price_before, town, shop, img_name, img_ext, hour, min, sec, day, month, year) VALUES ('$userID', '$title', '$price',' $price_before', '$town', '$shop', '$file_name', '$file_ext', '$hour', '$min', '$sec', '$day', '$month', '$year')"; 



       $result = $conn -> query($upload); 
       echo '<div style=width:100%;height:100%;display:flex;margin:0;> 
    <div style=width:auto;height:auto%;vertical-align:middle;margin:auto;><div class="cssload-spin-box"></div></div></div>'; 
header('Refresh: 2; URL = ../index.php'); 
       } else { 
        print_r($errors); 
       } 
      } 
     } 
} 

我面临同样的问题。所以这里是UIImage扩展名。

extension UIImage { 

    /// (Additional method to fix the image orientation issue on b/w server and client) 
    public func fixOrientation() -> UIImage { 
    if self.imageOrientation == UIImageOrientation.Up { 
     return self 
    } 

    var transform = CGAffineTransformIdentity 

    switch self.imageOrientation { 
    case .Down, .DownMirrored: 
     transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height) 
     transform = CGAffineTransformRotate(transform, CGFloat(M_PI)); 

    case .Left, .LeftMirrored: 
     transform = CGAffineTransformTranslate(transform, self.size.width, 0); 
     transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2)); 

    case .Right, .RightMirrored: 
     transform = CGAffineTransformTranslate(transform, 0, self.size.height); 
     transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2)); 

    case .Up, .UpMirrored: 
     break 
    } 

    switch self.imageOrientation { 

    case .UpMirrored, .DownMirrored: 
     transform = CGAffineTransformTranslate(transform, self.size.width, 0) 
     transform = CGAffineTransformScale(transform, -1, 1) 

    case .LeftMirrored, .RightMirrored: 
     transform = CGAffineTransformTranslate(transform, self.size.height, 0) 
     transform = CGAffineTransformScale(transform, -1, 1); 

    default: 
     break; 
    } 

    // Now we draw the underlying CGImage into a new context, applying the transform 
    // calculated above. 
    let ctx = CGBitmapContextCreate(
     nil, 
     Int(self.size.width), 
     Int(self.size.height), 
     CGImageGetBitsPerComponent(self.CGImage), 
     0, 
     CGImageGetColorSpace(self.CGImage), 
     UInt32(CGImageGetBitmapInfo(self.CGImage).rawValue) 
    ) 

    CGContextConcatCTM(ctx, transform); 

    switch self.imageOrientation { 
    case .Left, .LeftMirrored, .Right, .RightMirrored: 
     // Grr... 
     CGContextDrawImage(ctx, CGRectMake(0, 0, self.size.height,self.size.width), self.CGImage); 

    default: 
     CGContextDrawImage(ctx, CGRectMake(0, 0, self.size.width,self.size.height), self.CGImage); 
     break; 
    } 

    // And now we just create a new UIImage from the drawing context 
    let cgimg = CGBitmapContextCreateImage(ctx) 

    let img = UIImage(CGImage: cgimg!) 

    return img; 
} 
} 

现在修复图像方向将其发送到服务器

let imageToUpload = originalImage.fixOrientation() 

注意前:因为它拥有定向属性,则不要删除EXIF数据。

+0

谢谢,它似乎是有用的,但请你能告诉我如何实现它吗?我不是这样的亲。 –

+0

@IgorMiniMinarič这是快速的语言代码,将在iOS端实现。但我想你正在寻求PHP代码。对不起哥哥。 – TheTiger

我做了一个巨大的研究网络和此代码finaly完美工作。基本上我必须将img保存到目录中,然后打开dir并执行这个魔术。这是我想如何解决iOS定位相机问题最简单的方法。

$buffer = ImageCreateFromJPEG($url); //url is path to image 
$exif [email protected]_read_data($url); 
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, $url, 90);