2016-06-29 3 views
0

Я создал веб-приложение, где пользователи могут загружать свое изображение профиля. Если пользователь фиксирует изображение с помощью камеры своего мобильного устройства, ориентация меняется. Мне удалось решить это, используя следующий код: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); 
       } 

Получил этот код из PHP read_exif_data and Adjust Orientation

Однако, это работает только тогда, когда изображение захватывается с Android устройства или компьютера. Это не работает, если изображение захвачено с устройства iPhone.

во время отладки, я заметил, что у $image = imagerotate($image, -90, 0); есть проблема с iphone. Я могу сказать это наверняка, потому что эта строка не была выполнена (поскольку img_after.txt не создается там, где он должен был быть создан).

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

Пожалуйста, предложите!

UPDATE:

EXIF ​​данные считываются из 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 ​​считываемые из 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 
) 

Если я пропущу код, чтобы повернуть изображение, оно отлично работает на всех мобильных телефонах, включая iphone.

+0

Учитывая, что PHP не работает на стороне клиента (то есть это не андроид или ИОС работает его) вопрос испорчено. Вставьте некоторую отладку и найдите то, что отправляется по-разному. –

+0

Почему клиентская ОС имеет значение для сервера? Вы уверены, что '$ exif ['Orientation']' правильно установлен на iPhone для начала? – apokryfos

+0

Да. $ exif ['Orientation'] устанавливается правильно при загрузке с iPhone или Andoird –

ответ

0

Это «особенность» iPhone для защиты конфиденциальности, удаляя данные EXIF ​​из файла или, по крайней мере, справедливую его часть при загрузке изображения.

Раньше был хак, где вы могли получить эти данные из Javascript и передать его на ваш сервер, однако это больше не так.

Я больше не являюсь пользователем iPhone, но появились некоторые предположения и сообщения о том, что они исправлены в новых версиях iOS, которые, тем не менее, все еще оставляют проблему открытой для того факта, что большая часть вашей пользовательской базы возможно, не смогут предоставить вам эти данные.

Был длительный поток здесь, так что вы могли бы хотеть прочитать: Image upload from iphone strips exif data

+1

Я также могу получать данные EXIF ​​с iPhone. Я также разместил содержимое. Единственная проблема здесь заключается в выражении $ image = imagerotate ($ image, -90, 0); Не уверен, почему он не работает хорошо. Насколько я понимаю правильно, этот оператор выполняется на стороне сервера, а $ image также является допустимым изображением. Поэтому он должен давать правильные результаты, не так ли? –