从相机拍摄的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]; }
- 容器视图在completeTransition上消失:
- 添加自定义UIViews到UIScrollview – 如何计算位置,大小和处理缩放?
- 为什么当我为我的CABasicAnimation设置一个较低的持续时间值时,它会跳转吗?
- 在iPhone中使用iOS 7打开相机时,横向模式中的方向问题
- 如何在actionscript 3.0中从cameraUI for iOS旋转图像
- 'BOOL'(又名'signed char')到'id'的隐式转换,objc_setAssociatedObject
- iOS lazy var UIBarButtonItem目标问题
- 如何在核心数据中逐组应用
- 上传使用backgroundSessionConfiguration和NSURLSessionUploadTask导致应用程序崩溃