简体   繁体   English

从相机捕获的iphone图像自动旋转-90度

[英]iphone image captured from camera rotate -90 degree automatically

Programatically I have fetched image from my camera in my app.我以编程方式从我的应用程序中的相机中获取了图像。 It has been fetched nicely but when I shift to another view and dismiss that view at that time my image automatically rotate -90 degree.它已被很好地获取,但是当我切换到另一个视图并关闭该视图时,我的图像会自动旋转 -90 度。

and this change occurs only first time after that when I shift no change occurs means image stays in -90 degree state and this happens only when I captued image from camera.并且这种变化仅发生在第一次之后,当我移动时没有变化发生意味着图像保持在 -90 度状态,这仅在我从相机捕获图像时发生。 when I fetch image from photo library no issue has been found.当我从照片库中获取图像时,没有发现任何问题。

following image is my original image下图是我的原图

原图

and this is rotated image这是旋转的图像

旋转图像

I don't know why this change happen.我不知道为什么会发生这种变化。

you have to use this function to rotate image captured by camera您必须使用此功能来旋转相机拍摄的图像

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

The most simplest way to overcome this problem is by scaling the image inside didFinishPickingImage delegate.解决此问题的最简单方法是在didFinishPickingImage委托中缩放图像。 You can use the following code to scale by importing a class " UIImage+ImageScaling.h ".您可以使用以下代码通过导入类“ UIImage+ImageScaling.h ”进行缩放。

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

This method works for me,这个方法对我有用

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

The bad behavior has now changed with 13.4.不良行为现在已在 13.4 中改变。 Images are now captured with accurate orientation.现在以准确的方向捕获图像。

如果您仍然需要一些解决方案,请参阅链接,我在其中发布了我对此问题的答案,请参阅编辑和编辑 1 还请参阅最后 2 或 3 条评论以供进一步参考

Try this property试试这个属性

@property (nonatomic) CGAffineTransform cameraViewTransform

and rotate is with -90 degree and then capture the image.并以-90度旋转,然后捕获图像。 If doesn't work the use the code given by Cocoa Matters.如果不起作用,请使用 Cocoa Matters 提供的代码。

It is due to your image orientation.这是由于您的图像方向。 so keep original image orientation.所以保持原始图像方向。 you will get the image orientation in your UIImagePickerController delegate method您将在 UIImagePickerController 委托方法中获得图像方向

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

sample code:示例代码:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM