Я создал веб-приложение, в котором пользователи могут загружать свои фотографии профиля. Если пользователь захватывает изображение с помощью камеры своего мобильного телефона, ориентация меняется. Мне удалось решить это с помощью следующего кода:
$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.
Это «особенность» iPhone для защиты конфиденциальности путем удаления данных EXIF из файла или, по крайней мере, значительного их количества при загрузке изображения.
Раньше был взлом, где вы могли получить эти данные из Javascript и передать их бэкэнду, однако это уже не так.
Я больше не пользователь iPhone, но были некоторые предположения и сообщения о том, что он был исправлен в более новых версиях iOS, что, однако, все еще оставляет проблему открытой для факта, что большая часть вашей пользовательской базы может быть не в состоянии чтобы предоставить вам эти данные.
На SO была длинная тема, которую вы могли бы прочитать:
Загрузка изображения с iphone обрезает данные exif
Других решений пока нет …