2016-06-29 33 views
0

Ich habe eine Web-App erstellt, in dem Benutzer das Profilbild hochladen. Wenn der Benutzer ein Bild mit der Kamera seines Mobiltelefons aufnimmt, ändert sich die Ausrichtung. Ich schaffte es zu lösen mit dem folgenden Code:PHP Upload-Bild mit korrekter Ausrichtung - imagerotate nicht für das iPhone funktioniert

    $path[0] = $_FILES['image_upload_file']['tmp_name']; 

       $exif = exif_read_data($path[0]); 
       // $exif['Orientation'] = 6; 

       if(isset($exif['Orientation'])){ 

        $image = imagecreatefromjpeg($path[0]); 
        file_put_contents("img_data.txt",print_r($image,true)); 

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

         case 3: // 180 rotate left 
          $image = imagerotate($image, 180,0); 
          break; 


         case 6: // 90 rotate right 
          file_put_contents("img_before.txt",print_r($exif,true)); 
          $image = imagerotate($image, -90, 0); 
          file_put_contents("img_after.txt",print_r($ort,true)); 
          break; 

         case 8: // 90 rotate left 
          $image = imagerotate($image, 90, 0); 
          break; 
        } 
        imagejpeg($image, $path[0], 90); 
       } 

diesen Code erhielt von PHP read_exif_data and Adjust Orientation

Aber es funktioniert nur, wenn Bild von Android-Gerät erfaßt oder vom Computer vorhanden. Es funktioniert nicht, wenn das Bild vom iPhone-Gerät aufgenommen wird.

beim Debuggen, habe ich bemerkt, dass $image = imagerotate($image, -90, 0); mit iphone einige Probleme hat. Ich kann das sicher sagen, weil diese Zeile nicht ausgeführt wurde (da img_after.txt nicht dort erstellt wird, wo sie erstellt werden sollte).

file_put_contents("img_after.txt",print_r($ort,true)); 

Bitte schlagen Sie vor!

UPDATE:

EXIF-Daten lesen von iPhone:

Array 
(
    [FileName] => phpYBaC5W 
    [FileDateTime] => 1467207697 
    [FileSize] => 1430214 
    [FileType] => 2 
    [MimeType] => image/jpeg 
    [SectionsFound] => ANY_TAG, IFD0, EXIF 
    [COMPUTED] => Array 
     (
      [html] => width="3264" height="2448" 
      [Height] => 2448 
      [Width] => 3264 
      [IsColor] => 1 
      [ByteOrderMotorola] => 1 
     ) 

    [Orientation] => 6 
    [Exif_IFD_Pointer] => 38 
    [ColorSpace] => 1 
    [ExifImageWidth] => 3264 
    [ExifImageLength] => 2448 
) 

exif Lesen von Daten aus Android:

Array 
(
    [FileName] => phpMQHUgW 
    [FileDateTime] => 1467207789 
    [FileSize] => 1842753 
    [FileType] => 2 
    [MimeType] => image/jpeg 
    [SectionsFound] => ANY_TAG, IFD0, THUMBNAIL, EXIF, GPS, INTEROP 
    [COMPUTED] => Array 
     (
      [html] => width="3264" height="1836" 
      [Height] => 1836 
      [Width] => 3264 
      [IsColor] => 1 
      [ByteOrderMotorola] => 0 
      [ApertureFNumber] => f/2.4 
      [Thumbnail.FileType] => 2 
      [Thumbnail.MimeType] => image/jpeg 
      [Thumbnail.Height] => 288 
      [Thumbnail.Width] => 512 
     ) 

    [ImageWidth] => 3264 
    [ImageLength] => 1836 
    [Make] => SAMSUNG 
    [Model] => SM-G7102 
    [Orientation] => 6 
    [XResolution] => 72/1 
    [YResolution] => 72/1 
    [ResolutionUnit] => 2 
    [Software] => G7102DDUBOB1 
    [DateTime] => 2016:06:29 19:12:59 
    [YCbCrPositioning] => 1 
    [Exif_IFD_Pointer] => 238 
    [GPS_IFD_Pointer] => 870 
    [THUMBNAIL] => Array 
     (
      [ImageWidth] => 512 
      [ImageLength] => 288 
      [Compression] => 6 
      [Orientation] => 6 
      [XResolution] => 72/1 
      [YResolution] => 72/1 
      [ResolutionUnit] => 2 
      [JPEGInterchangeFormat] => 1018 
      [JPEGInterchangeFormatLength] => 5829 
     ) 

    [ExposureTime] => 1/17 
    [FNumber] => 240/100 
    [ExposureProgram] => 2 
    [ISOSpeedRatings] => 1000 
    [ExifVersion] => 0220 
    [DateTimeOriginal] => 2016:06:29 19:12:59 
    [DateTimeDigitized] => 2016:06:29 19:12:59 
    [ComponentsConfiguration] => 
    [ShutterSpeedValue] => 405/100 
    [ApertureValue] => 252/100 
    [BrightnessValue] => -169/100 
    [ExposureBiasValue] => 0/10 
    [MaxApertureValue] => 253/100 
    [MeteringMode] => 2 
    [LightSource] => 0 
    [Flash] => 0 
    [FocalLength] => 293/100 
    [MakerNote] =>  0100      Z @   P        
    [FlashPixVersion] => 0100 
    [ColorSpace] => 1 
    [ExifImageWidth] => 3264 
    [ExifImageLength] => 1836 
    [InteroperabilityOffset] => 840 
    [SensingMethod] => 2 
    [SceneType] => 
    [ExposureMode] => 0 
    [WhiteBalance] => 0 
    [FocalLengthIn35mmFilm] => 31 
    [SceneCaptureType] => 0 
    [ImageUniqueID] => E08QLGI01CH 
    [GPSVersion] => 
    [InterOperabilityIndex] => R98 
    [InterOperabilityVersion] => 0100 
) 

Wenn ich den Code überspringen Bild zu drehen, es funktioniert gut in allen Handys einschließlich iPhone.

+0

Da PHP nicht auf dem Client ausgeführt wird (das heißt, es läuft es nicht Android- oder iOS ist) die Frage fehlerhaft ist. Legen Sie etwas Debugging an und finden Sie heraus, was anders gesendet wird. –

+0

Warum sollte das Client-Betriebssystem für den Server von Bedeutung sein? Sind Sie sicher, dass $ exif ['Orientation'] 'auf dem iPhone richtig eingestellt ist? – apokryfos

+0

ja. $ Exif [ ‚Ausrichtung‘] richtig eingestellt ist, wenn sie von iPhone oder Andoird hochgeladen –

Antwort

0

Dies ist ein „Feature“ des iPhone zum Schutz der Privatsphäre durch die EXIF-Daten aus einer Datei Strippen, oder zumindest ein gutes Stück davon, wenn ein Bild hochladen.

verwendet Es gibt einen Hack zu sein, wo Sie diese Daten von Javascript erhalten könnte und geben sie nicht an Ihrem Backend auf, jedoch scheint dies nicht mehr der Fall zu sein.

Ich bin kein iPhone Benutzer mehr, aber es gab einige Spekulationen und Berichte, dass es in neueren Versionen von iOS behoben wurde, was jedoch das Problem weit offen lässt, dass ein großer Teil Ihrer Benutzerbasis möglicherweise nicht in der Lage, Ihnen diese Daten zu liefern.

Es war ein langwieriger Thread hier auf SO könnten Sie lesen wollen: Image upload from iphone strips exif data

+1

Ich bin in der Lage, die EXIF-Daten vom iPhone auch zu erhalten .. Ich habe den Inhalt auch gepostet. Das einzige Problem hier ist mit der Anweisung $ image = imagerotate ($ image, -90, 0); Nicht sicher, warum es nicht gut ausgeführt wird. Soweit ich richtig verstanden habe, wird diese Anweisung auf der Serverseite ausgeführt und $ image ist auch ein gültiges Image. Es soll also korrekte Ergebnisse geben, oder? –