Camera image rotation issue

后端 未结 3 600
独厮守ぢ
独厮守ぢ 2021-02-09 04:41

I am facing a very strange problem here. When i click an image in portrait mode and upload it and then again fetch it it is displayed rotated 90 degrees counter clock wise. But

相关标签:
3条回答
  • 2021-02-09 04:47

    TRy using this one:

    NSData *profileData =  UIImageJPEGRepresentation(self.profileImgView.image, 1.0); 
    

    instead of:

    NSData *profileData = UIImagePNGRepresentation(profileImgView.image);
    

    Hope it works. :)

    0 讨论(0)
  • 2021-02-09 04:54

    Resolved by making a category on UIImage and scaling and rotating image based on their metadata EXIF's.

    Here's the magical piece of code:

    - (UIImage *)scaleAndRotateImage:(UIImage *)image {
    
        int kMaxResolution = 640; // 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 = roundf(bounds.size.width / ratio);
            }
            else {
                bounds.size.height = kMaxResolution;
                bounds.size.width = roundf(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();
    
        return imageCopy;
    }
    
    0 讨论(0)
  • 2021-02-09 05:07

    i hope its help for you:

    Here i am giving resizeing that image as well as u are problem will also solve.

    FirstWay:

        - (UIImage *)scaleAndRotateImage:(UIImage *)imgPic {
    
        int kMaxResolution = 650; // Or whatever    
        CGImageRef imgRef = imgPic.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 = roundf(bounds.size.width / ratio);         
            }       
            else {          
                bounds.size.height = kMaxResolution;            
                bounds.size.width = roundf(bounds.size.height * ratio);         
            }       
        }   
        CGFloat scaleRatio = bounds.size.width / width; 
        CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));   
        CGFloat boundHeight;    
        UIImageOrientation orient = imgPic.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();
        CGContextRelease(context);
        CGImageRelease(imgRef);
        return imageCopy;
    
    }
    

    Second Way: (if u dosen't get the answer for above method please use this method)

        +(UIImage *)resizeImage:(UIImage *)image toSize:(CGSize)destSize{
            float currentHeight = image.size.height;
            float currentWidth = image.size.width;
            float liChange ;
            CGSize newSize ;
            if(currentWidth == currentHeight) // image is square
            {
                liChange = destSize.height / currentHeight;
                newSize.height = currentHeight * liChange;
                newSize.width = currentWidth * liChange;
            }
            else if(currentHeight > currentWidth) // image is landscape
                {
                    liChange  = destSize.width / currentWidth;
                    newSize.height = currentHeight * liChange;
                    newSize.width = destSize.width;
                }
            else                                // image is Portrait
                {
                liChange = destSize.height / currentHeight;
                newSize.height= destSize.height;
                newSize.width = currentWidth * liChange;
                }
    
    
            UIGraphicsBeginImageContext( newSize );
            CGContextRef                context;
            UIImage                     *outputImage = nil;
    
            context = UIGraphicsGetCurrentContext();
            [image drawInRect:CGRectMake( 0, 0, newSize.width, newSize.height )];
            outputImage = UIGraphicsGetImageFromCurrentImageContext();
    
            UIGraphicsEndImageContext();
    
            CGImageRef imageRef;
            int x = (newSize.width == destSize.width) ? 0 : (newSize.width - destSize.width)/2;
            int y = (newSize.height == destSize.height) ? 0 : (newSize.height - destSize.height )/2;
            if ( ( imageRef = CGImageCreateWithImageInRect( outputImage.CGImage, CGRectMake(x, y, destSize.width, destSize.height) ) ) ) {
                outputImage = [[UIImage alloc] initWithCGImage: imageRef] ;
            }
            CGImageRelease(imageRef);
            return  outputImage;
        }
    
    0 讨论(0)
提交回复
热议问题