Я создал веб-приложение, где пользователи могут загружать свое изображение профиля. Если пользователь фиксирует изображение с помощью камеры своего мобильного устройства, ориентация меняется. Мне удалось решить это, используя следующий код: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.
Учитывая, что PHP не работает на стороне клиента (то есть это не андроид или ИОС работает его) вопрос испорчено. Вставьте некоторую отладку и найдите то, что отправляется по-разному. –
Почему клиентская ОС имеет значение для сервера? Вы уверены, что '$ exif ['Orientation']' правильно установлен на iPhone для начала? – apokryfos
Да. $ exif ['Orientation'] устанавливается правильно при загрузке с iPhone или Andoird –