【问题标题】:iphone image captured from camera rotate -90 degree automatically从相机拍摄的iphone图像自动旋转-90度
【发布时间】:2012-03-08 14:37:51
【问题描述】:

在我的应用程序中,我以编程方式从我的相机中获取了图像。它已经很好地获取了,但是当我切换到另一个视图并在那时关闭该视图时,我的图像会自动旋转 -90 度。

并且这种变化仅在第一次发生后才发生,当我换档时没有发生变化意味着图像保持在 -90 度状态,并且仅当我从相机捕获图像时才会发生这种情况。当我从照片库中获取图像时,没有发现任何问题。

下图是我的原图

这是旋转的图像

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

【问题讨论】:

  • 将此图像保存到库中,看看图像是否旋转?
  • @InderKumarRathore:我从存储在库中的设备摄像头捕获图像,然后在我的应用程序中拍摄该图像,然后它也被旋转
  • 经过大量研究后我遇到了同样的问题,我找到了解决方案检查我的答案

标签: ios objective-c iphone xcode camera


【解决方案1】:

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

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

【讨论】:

  • 对于这样一个小小的轮换来说已经差不多了 .__.
  • 我在我的应用程序中遇到了同样的问题,我已经尝试过你的,但它没有效果。图像仍在旋转。可能是什么问题?
  • 什么问题请详细说明
  • 在运行从 AVCaptureSession 中的 AVCaptureVideoDataOutput 获得的图像作为直接转换为 UIImage 的 CGImageRef 后,它似乎没有做任何事情。我将 orient 变量更改为 [[UIDevice currentDevice] 方向](确保它在主线程中运行),但整个东西仍然旋转了 90 度。调整方向的推荐方法是什么?
  • @thatjuan 我没明白你的意思。你能给我发这个演示吗?所以我可以解决你的问题
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这个方法对我有用,

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

    【讨论】:

      【解决方案4】:

      不好的行为现在在 13.4 中发生了变化。现在以准确的方向捕获图像。

      【讨论】:

        【解决方案5】:

        试试这个属性

        @property (nonatomic) CGAffineTransform cameraViewTransform

        并旋转 -90 度,然后捕获图像。如果不起作用,请使用 Cocoa Matters 提供的代码。

        【讨论】:

          【解决方案6】:

          如果您仍然需要一些解决方案,请参考 this 链接,我在其中发布了我对这个问题的答案,只需参考编辑和编辑 1 还可以查看最后 2 或 3 个 cmets 以供进一步参考

          【讨论】:

            【解决方案7】:

            这是由于您的图像方向。所以保持原始图像方向。您将在 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];
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-02-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-03
              • 2013-10-30
              • 2018-03-06
              相关资源
              最近更新 更多