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

问题描述:

以编程方式,我从我的相机中取得了我的应用程序中的图像。它已被很好地提取,但当我转移到另一个视图,并在当时驳回该视图,我的图像自动旋转-90度。从相机拍摄的iphone图像自动旋转-90度

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

下图是我的原始图像

Original image

这个旋转图像

rotated image

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

+0

此图像保存到库,看看图像是否是是否旋转? – 2012-02-17 07:02:27

+0

@InderKumarRathore:我从存储在库中的设备相机捕获图像,然后我在我的应用程序中拍摄该图像,然后它也旋转 – iPhone 2012-02-17 07:07:49

+0

我有很多研究后,我也有同样的问题,我发现解决方案检查我的答案 – Hiren 2012-02-17 07:10:30

你要使用此功能通过旋转摄像头

- (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; 
} 
+4

很多这样一个小旋转.__。 – filou 2012-05-18 09:35:01

+0

我在我的应用程序中有同样的问题,我已经尝试过,但它不起作用。图像仍然旋转。可能是什么问题? – Purva 2012-10-03 06:58:10

+0

有什么问题请详细解释 – Hiren 2012-10-03 07:13:09

拍摄的图像试试这个属性

@property (nonatomic) CGAffineTransform cameraViewTransform

和旋转是-90度,然后捕获图像。如果不起作用,则使用Cocoa Matters给出的代码。

如果你仍然需要一些解决方案只是指this链接,我贴我的回答这个问题,只是指编辑和编辑1也看到了进一步的参考

克服的最简单的方法的最后2或3条评论这个问题是通过缩放didFinishPickingImage代表中的图像。您可以使用以下代码通过导入类“UIImage+ImageScaling.h”进行缩放。

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

这是因为你的形象定位。所以保持原始图像的方向。你会得到的图像定位在你的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]; 
} 

这个方法对我的作品,

- (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; 
}