从相机拍摄的iphone图像自动旋转-90度

在编程上,我从我的相机中取得了我的应用程序中的图像。 它已被很好地取出,但当我转移到另一种观点,当时驳回这一观点,我的形象自动旋转-90度。

而这种变化只发生在第一次之后,当我移动没有发生变化时,意味着图像保持在-90度的状态,而这种情况只有在我从相机拍摄图像时才会发生。 当我从照片库取图像没有发现问题。

以下图像是我的原始图像

原始图像

这是旋转的图像

旋转的图像

我不知道为什么会发生这种变化。

您必须使用此function来旋转由相机拍摄的图像

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo { image = [self scaleAndRotateImage:image]; [self useImage:image]; [[picker parentViewController] dismissModalViewControllerAnimated:YES]; } - (void)scaleAndRotateImage:(UIImage *)image { int kMaxResolution = 320; // 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 = bounds.size.width / ratio; } else { bounds.size.height = kMaxResolution; bounds.size.width = 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(); [self setRotatedImage:imageCopy]; //return imageCopy; } 

解决这个问题最简单的方法是通过缩放didFinishPickingImage委托中的图像。 您可以使用以下代码通过导入类“ UIImage+ImageScaling.h ”来进行缩放。

theImage =[UIImage imageWithImage:image scaledToSizeWithSameAspectRatio:CGSizeMake(400, 300)]; // for iphone.

这种方法适用于我,

 - (UIImage*) rotateImageAppropriately:(UIImage*)imageToRotate { UIImage* properlyRotatedImage; CGImageRef imageRef = [imageToRotate CGImage]; if (imageToRotate.imageOrientation == 0) { properlyRotatedImage = imageToRotate; } else if (imageToRotate.imageOrientation == 3) { CGSize imgsize = imageToRotate.size; UIGraphicsBeginImageContext(imgsize); [imageToRotate drawInRect:CGRectMake(0.0, 0.0, imgsize.width, imgsize.height)]; properlyRotatedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } else if (imageToRotate.imageOrientation == 1) { properlyRotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:1]; } return properlyRotatedImage; } 

试试这个属性

@property (nonatomic) CGAffineTransform cameraViewTransform

并旋转-90度,然后捕捉图像。 如果不行的话,使用Cocoa Matters给出的代码。

如果你仍然需要一些解决scheme,只需参考这个链接,我发布了我的答案这个问题只是参考编辑和编辑1也见最后2或3的意见作进一步的参考

这是由于你的形象定位。 所以保持原始图像的方向。 您将在UIImagePickerController委托方法中获取图像方向

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 

示例代码:

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *sourceImage = [info valueForKey:UIImagePickerControllerOriginalImage]; NSData *data = UIImagePNGRepresentation(sourceImage); UIImage *tmp = [UIImage imageWithData:data]; UIImage *afterFixingOrientation = [UIImage imageWithCGImage:tmp.CGImage scale:sourceImage.scale orientation:sourceImage.imageOrientation]; [self.imagePickerController dismissViewControllerAnimated:YES completion:nil]; }