ios — 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 и настроить ориентацию

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

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

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

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

ОБНОВИТЬ:

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

Решение

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

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

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

На SO была длинная тема, которую вы могли бы прочитать:
Загрузка изображения с iphone обрезает данные exif

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]