Исправить ориентацию изображения iOS после загрузки PHP

Есть ли способ повернуть изображение с PHP только в том случае, если он некорректно расположен после загрузки с iOS?

Некоторые снимки поворачиваются на 90 градусов, а другие загружаются правильно.

Solutions Collecting From Web of "Исправить ориентацию изображения iOS после загрузки PHP"

Изображение вращается, потому что вы сохраняете изображение в формате JPEG, если вы сохраняете изображение в PNG, ориентация не изменится. вот код для исправления проблемы с ориентацией.

- (UIImage *)fixrotation:(UIImage *)image{ if (image.imageOrientation == UIImageOrientationUp) return image; CGAffineTransform transform = CGAffineTransformIdentity; switch (image.imageOrientation) { case UIImageOrientationDown: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, image.size.width, image.size.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: transform = CGAffineTransformTranslate(transform, image.size.width, 0); transform = CGAffineTransformRotate(transform, M_PI_2); break; case UIImageOrientationRight: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, 0, image.size.height); transform = CGAffineTransformRotate(transform, -M_PI_2); break; case UIImageOrientationUp: case UIImageOrientationUpMirrored: break; } switch (image.imageOrientation) { case UIImageOrientationUpMirrored: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, image.size.width, 0); transform = CGAffineTransformScale(transform, -1, 1); break; case UIImageOrientationLeftMirrored: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, image.size.height, 0); transform = CGAffineTransformScale(transform, -1, 1); break; case UIImageOrientationUp: case UIImageOrientationDown: case UIImageOrientationLeft: case UIImageOrientationRight: break; } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. CGContextRef ctx = CGBitmapContextCreate(NULL, image.size.width, image.size.height, CGImageGetBitsPerComponent(image.CGImage), 0, CGImageGetColorSpace(image.CGImage), CGImageGetBitmapInfo(image.CGImage)); CGContextConcatCTM(ctx, transform); switch (image.imageOrientation) { case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: case UIImageOrientationRight: case UIImageOrientationRightMirrored: // Grr... CGContextDrawImage(ctx, CGRectMake(0,0,image.size.height,image.size.width), image.CGImage); break; default: CGContextDrawImage(ctx, CGRectMake(0,0,image.size.width,image.size.height), image.CGImage); break; } // And now we just create a new UIImage from the drawing context CGImageRef cgimg = CGBitmapContextCreateImage(ctx); UIImage *img = [UIImage imageWithCGImage:cgimg]; CGContextRelease(ctx); CGImageRelease(cgimg); return img; } 

Используйте exif_read_data, чтобы узнать ориентацию изображения:

 $exif = exif_read_data('image.jpg'); if (isset($exif['Orientation'])) { switch ($exif['Orientation']) { case 3: // Need to rotate 180 deg break; case 6: // Need to rotate 90 deg clockwise break; case 8: // Need to rotate 90 deg counter clockwise break; } } 

Здесь вы найдете объяснение кодов ориентации: http://www.impulseadventure.com/photo/exif-orientation.html

Это не совсем ответит на ваш вопрос, но я всегда использую этот скрипт, чтобы зафиксировать ориентацию и масштаб до разумного размера предварительной загрузки. Таким образом, вы сохраняете пользователь hte-приложения с некоторой пропускной способностью и не должны иметь ничего, что могло бы сделать серверная сторона.

 - (UIImage *)scaleAndRotateImage:(UIImage *)image { int kMaxResolution = 1024; // Or whatever CGImageRef imgRef = image.CGImage; CGFloat width = CGImageGetWidth(imgRef); CGFloat height = CGImageGetHeight(imgRef); CGAffineTransform transform = CGAffineTransformIdentity; CGRect bounds = CGRectMake(0, 0, width, height); if (width > kMaxResolution || height > kMaxResolution) { CGFloat ratio = width/height; if (ratio > 1) { bounds.size.width = kMaxResolution; bounds.size.height = roundf(bounds.size.width / ratio); } else { bounds.size.height = kMaxResolution; bounds.size.width = roundf(bounds.size.height * ratio); } } CGFloat scaleRatio = bounds.size.width / width; CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); CGFloat boundHeight; UIImageOrientation orient = image.imageOrientation; switch(orient) { case UIImageOrientationUp: //EXIF = 1 transform = CGAffineTransformIdentity; break; case UIImageOrientationUpMirrored: //EXIF = 2 transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); transform = CGAffineTransformScale(transform, -1.0, 1.0); break; case UIImageOrientationDown: //EXIF = 3 transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationDownMirrored: //EXIF = 4 transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); transform = CGAffineTransformScale(transform, 1.0, -1.0); break; case UIImageOrientationLeftMirrored: //EXIF = 5 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width); transform = CGAffineTransformScale(transform, -1.0, 1.0); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationLeft: //EXIF = 6 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(0.0, imageSize.width); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationRightMirrored: //EXIF = 7 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeScale(-1.0, 1.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; case UIImageOrientationRight: //EXIF = 8 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; default: [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"]; } UIGraphicsBeginImageContext(bounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { CGContextScaleCTM(context, -scaleRatio, scaleRatio); CGContextTranslateCTM(context, -height, 0); } else { CGContextScaleCTM(context, scaleRatio, -scaleRatio); CGContextTranslateCTM(context, 0, -height); } CGContextConcatCTM(context, transform); CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return imageCopy; } 

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

единственная функция функции

 <?php /* Correct image orientation v1.0 Author: Mathuvathanan Mounasamy Licensed under the MIT license This function correct all the images' orientation in a given path or directory. Run: php -r "require 'correctImageOrientation.php'; correctImageOrientation('test/');" or php -r "require 'correctImageOrientation.php'; correctImageOrientation('test/test1');" or php -r "require 'correctImageOrientation.php'; correctImageOrientation('test');" */ function correctImageOrientation($directory) { $scanned_directory = array_diff(scandir($directory), array('..', '.')); echo "<pre>"; print_r("scanned directory: \r\n"); print_r($scanned_directory); echo "</pre>\r\n"; foreach ($scanned_directory as &$file) { if (is_dir($directory."/".$file)) { correctImageOrientation($directory."/".$file); } else { $filen = explode(".", $file); $ext = end($filen); try { $exif = @exif_read_data($directory."/".$file); $orientation = $exif['Orientation']; if (isset($orientation) && $orientation != 1){ switch ($orientation) { case 3: $deg = 180; break; case 6: $deg = 270; break; case 8: $deg = 90; break; } if ($deg) { // If png if ($ext == "png") { $img_new = imagecreatefrompng($directory."/".$file); $img_new = imagerotate($img_new, $deg, 0); // Save rotated image imagepng($img_new,$directory.$file); }else { $img_new = imagecreatefromjpeg($directory."/".$file); $img_new = imagerotate($img_new, $deg, 0); // Save rotated image imagejpeg($img_new,$directory."/".$file,80); } } echo "<pre>"; print_r("image changed: \r\n"); print_r($directory."/".$file); echo "</pre>\r\n"; } } catch (Exception $e) { echo "error:"; echo $e; echo "error"; } } } unset($file); } ?> с <?php /* Correct image orientation v1.0 Author: Mathuvathanan Mounasamy Licensed under the MIT license This function correct all the images' orientation in a given path or directory. Run: php -r "require 'correctImageOrientation.php'; correctImageOrientation('test/');" or php -r "require 'correctImageOrientation.php'; correctImageOrientation('test/test1');" or php -r "require 'correctImageOrientation.php'; correctImageOrientation('test');" */ function correctImageOrientation($directory) { $scanned_directory = array_diff(scandir($directory), array('..', '.')); echo "<pre>"; print_r("scanned directory: \r\n"); print_r($scanned_directory); echo "</pre>\r\n"; foreach ($scanned_directory as &$file) { if (is_dir($directory."/".$file)) { correctImageOrientation($directory."/".$file); } else { $filen = explode(".", $file); $ext = end($filen); try { $exif = @exif_read_data($directory."/".$file); $orientation = $exif['Orientation']; if (isset($orientation) && $orientation != 1){ switch ($orientation) { case 3: $deg = 180; break; case 6: $deg = 270; break; case 8: $deg = 90; break; } if ($deg) { // If png if ($ext == "png") { $img_new = imagecreatefrompng($directory."/".$file); $img_new = imagerotate($img_new, $deg, 0); // Save rotated image imagepng($img_new,$directory.$file); }else { $img_new = imagecreatefromjpeg($directory."/".$file); $img_new = imagerotate($img_new, $deg, 0); // Save rotated image imagejpeg($img_new,$directory."/".$file,80); } } echo "<pre>"; print_r("image changed: \r\n"); print_r($directory."/".$file); echo "</pre>\r\n"; } } catch (Exception $e) { echo "error:"; echo $e; echo "error"; } } } unset($file); } ?> 

вы можете добавить ниже сценарий после загрузки изображения в папку

  $filename = "/files/1.jpg"; /*ADD YOUR FILENAME WITH PATH*/ $exif = exif_read_data($filename); $ort = $exif['Orientation']; /*STORES ORIENTATION FROM IMAGE */ $ort1 = $ort; $exif = exif_read_data($filename, 0, true); if (!empty($ort1)) { $image = imagecreatefromjpeg($filename); $ort = $ort1; switch ($ort) { case 3: $image = imagerotate($image, 180, 0); break; case 6: $image = imagerotate($image, -90, 0); break; case 8: $image = imagerotate($image, 90, 0); break; } } imagejpeg($image,$filename, 90); /*IF FOUND ORIENTATION THEN ROTATE IMAGE IN PERFECT DIMENSION*/ 

этот скрипт работает после того, как изображение будет загружено в папку, поэтому вы можете добавить этот скрипт после загрузки файла в папку

Используя GD Library, мы можем манипулировать изображениями на PHP. Этот скрипт использует функцию imagerotate () для поворота фотографии. В нашем случае мы поворачиваем его на 90 градусов, но это может быть изменено в скрипте.

  <?php // The file you are rotating $image = 'myfile.jpg'; //How many degrees you wish to rotate $degrees = 90; // This sets the image type to .jpg but can be changed to png or gif header('Content-type: image/jpeg') ; // Create the canvas $source = imagecreatefromjpeg($image) ; // Rotates the image $rotate = imagerotate($source, $degrees, 0) ; // Outputs a jpg image, you could change this to gif or png if needed imagejpeg($rotate) ; ?> 

Самая важная часть этого скрипта, вращающаяся, выполняется с помощью функции imagerotate (). Параметры этой функции:

 imagerotate (The_image, degrees_to_rotate, background_color, Optional_ignore_transparency) 

Если опционная прозрачность игнорирования пуста или 0, прозрачность сохраняется.

 array getimagesize ( string $filename [, array &$imageinfo ] ) 

Функция getimagesize () определит размер любого заданного файла изображения и вернет размеры вместе с типом файла и текстовой строкой высоты / ширины, которая будет использоваться в обычном теге HTML IMG и соответствующем типе содержимого HTTP.

Вы должны использовать это, чтобы проверить, как ориентировано изображение телефона, чтобы вы могли узнать, когда вызывать функцию imagerotate ().

Вы также можете сохранить изображение с помощью imagejpeg. http://www.php.net/manual/en/function.imagejpeg.php

 // Save the image as 'path/to/myfile.jpg' imagejpeg($image, 'path/to/myfile.jpg'); // Free up memory imagedestroy($image); 
 // File and rotation $filename = 'test.jpg'; $degrees = 180; // Content type header('Content-type: image/jpeg'); // Load $source = imagecreatefromjpeg($filename); // Rotate $rotate = imagerotate($source, $degrees, 0); // Output imagejpeg($rotate); check this link : http://www.php.net/manual/en/function.imagerotate.php 

если вы используете ImageMagick, для этого есть простое исправление, просто добавьте -auto-orient к вашей команде.

 convert -auto-orient -quality 90 -resize 1200x800 $f-new