2016-06-29 8 views
0

ユーザーがプロフィール画像をアップロードできるWebアプリケーションを作成しました。ユーザーが携帯電話のカメラを使用して画像をキャプチャすると、向きが変わります。私は、次のコードを使用して、それを解決するために管理:正しい向きのPHPアップロード画像 - imagerotateはiPhone用には機能しません

    $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); 
       } 

は画像がAndroidデバイスまたはコンピュータからキャプチャされたときしかし、それだけで動作しますPHP read_exif_data and Adjust Orientation

からこのコードを手に入れました。画像がiPhoneデバイスからキャプチャされている場合は動作しません。

デバッグ中に、私は$image = imagerotate($image, -90, 0);がiphoneに問題があることに気付きました。 この行が実行されなかったので(これは作成されるはずの場所にimg_after.txtが作成されていないため)、これを確実に言うことができます。

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

お勧めします。

UPDATE:アンドロイドから読み取る

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データ:iPhoneから読み取る

EXIFデータ

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 
) 

私は、画像を回転させるためのコードをスキップする場合は、それiPhoneを含むすべての携帯電話で正常に動作します。

+0

は、PHPがクライアント上で実行されていないことを考える:

は上のここでの長いスレッドがSOあなたが読みたいかもしれませんがありました。いくつかのデバッグを入れて、何が異なって送られているのかを見つけてください。 –

+0

クライアントOSはなぜサーバーにとって重要なのでしょうか? '$ exif ['Orientation']'はiPhoneで正しく設定されていますか? – apokryfos

+0

はい。 $ exif ['Orientation']がiPhoneまたはAndoirdからアップロードされたときに正しく設定されています –

答えて

0

これは、ファイルからEXIFデータを取り除くことによってプライバシーを保護するためのiPhoneの「機能」です。画像をアップロードする際には、少なくともそれほどのビット数は必要ありません。

以前はJavascriptからそのデータを取得してバックエンドに渡すことができるハックがありましたが、これはもはや当てはまりません。

私はもはやiPhoneユーザーではありませんが、新しいバージョンのiOSで修正されているという憶測や報告がありますが、それでも問題はあなたのユーザーベースの大部分そのデータをあなたに供給することができない場合があります。質問は欠陥がある(すなわち、それはアンドロイドではないか、それを実行しているIOS)Image upload from iphone strips exif data

+1

iPhoneからEXIFデータも受信できます。コンテンツも投稿しました。ここでの唯一の問題は、文$ image = imagerotate($ image、-90、0)です。なぜそれがうまく動作しないのか分かりません。私が正しく理解する限り、この文はサーバ側で実行されており、$ imageも有効な画像です。正しい結果を返すはずです。 –

関連する問題