I've created a web app where users can upload their profile picture. If user captures image using his mobile's camera, the orientation gets changed. I managed to resolve it using the following code:
$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);
}
Got this code from PHP read_exif_data and Adjust Orientation
However, it only works when image is captured from Android device or from computer. It does not work if image is captured from iPhone device.
while debugging, i've noticed that $image = imagerotate($image, -90, 0);
has some issue with iphone.
I can say this surely because this line was not executed (as img_after.txt is not created where it was supposed to be created).
file_put_contents("img_after.txt",print_r($ort,true));
Please suggest!
UPDATE:
exif data read from 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 data read from 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
)
If I skip the code to rotate image, it works fine in all mobiles including iphone.