【问题标题】:saving image with wrong orientation保存方向错误的图像
【发布时间】:2012-10-01 05:35:49
【问题描述】:

我正在使用AGImagepickerContoller,它可以保存相机胶卷中的多张图像,我正在以这种方式保存在successBlock

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,    NSUserDomainMask ,YES );
    NSString *documentsDir = [paths objectAtIndex:0];
    NSString *savedImagePath = [documentsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"oneSlotImages%u.png", i]];

    ALAssetRepresentation *rep = [[info objectAtIndex: i] defaultRepresentation];
    UIImage *image = [UIImage imageWithCGImage:[rep fullResolutionImage]];

    //----resize the images
    image = [self imageByScalingAndCroppingForSize:image toSize:CGSizeMake(256,256*image.size.height/image.size.width)];

    NSData *imageData = UIImagePNGRepresentation(image);
    [imageData writeToFile:savedImagePath atomically:YES];

我的问题是保存时,并在我的预览中加载使用。它看起来像这样:

我想要的是在预览中是这样的:

我已阅读此iOS UIImagePickerController result image orientation after upload

但我不太明白我应该把它放在我的代码中的什么地方。希望有人可以指导我的问题。谢谢。

【问题讨论】:

    标签: iphone ios xcode


    【解决方案1】:

    这是方法,传递任何方向的 UIImage 它将返回纵向图像

    -(UIImage*)rotateUIImage:(UIImage*)src {
    
        // No-op if the orientation is already correct
        if (src.imageOrientation == UIImageOrientationUp) return src ;
    
        // We need to calculate the proper transformation to make the image upright.
        // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
        CGAffineTransform transform = CGAffineTransformIdentity;
    
        switch (src.imageOrientation) {
            case UIImageOrientationDown:
            case UIImageOrientationDownMirrored:
                transform = CGAffineTransformTranslate(transform, src.size.width, src.size.height);
                transform = CGAffineTransformRotate(transform, M_PI);
                break;
    
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
                transform = CGAffineTransformTranslate(transform, src.size.width, 0);
                transform = CGAffineTransformRotate(transform, M_PI_2);
                break;
    
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                transform = CGAffineTransformTranslate(transform, 0, src.size.height);
                transform = CGAffineTransformRotate(transform, -M_PI_2);
                break;
            case UIImageOrientationUp:
            case UIImageOrientationUpMirrored:
                break;
        }
    
        switch (src.imageOrientation) {
            case UIImageOrientationUpMirrored:
            case UIImageOrientationDownMirrored:
                transform = CGAffineTransformTranslate(transform, src.size.width, 0);
                transform = CGAffineTransformScale(transform, -1, 1);
                break;
    
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRightMirrored:
                transform = CGAffineTransformTranslate(transform, src.size.height, 0);
                transform = CGAffineTransformScale(transform, -1, 1);
                break;
            case UIImageOrientationUp:
            case UIImageOrientationDown:
            case UIImageOrientationLeft:
            case UIImageOrientationRight:
                break;
        }
    
        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        CGContextRef ctx = CGBitmapContextCreate(NULL, src.size.width, src.size.height,
                                                 CGImageGetBitsPerComponent(src.CGImage), 0,
                                                 CGImageGetColorSpace(src.CGImage),
                                                 CGImageGetBitmapInfo(src.CGImage));
        CGContextConcatCTM(ctx, transform);
        switch (src.imageOrientation) {
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                // Grr...
                CGContextDrawImage(ctx, CGRectMake(0,0,src.size.height,src.size.width), src.CGImage);
                break;
    
            default:
                CGContextDrawImage(ctx, CGRectMake(0,0,src.size.width,src.size.height), src.CGImage);
                break;
        }
    
        // And now we just create a new UIImage from the drawing context
        CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
        UIImage *img = [UIImage imageWithCGImage:cgimg];
        CGContextRelease(ctx);
        CGImageRelease(cgimg);
        return img;
    }
    

    【讨论】:

    • 它应该是一个全局方法。顺便说一句,谢谢你,就像一个魅力。
    【解决方案2】:

    导入该类别方法并将其放在这样调整大小之前。

    image  = [self fixOrientation]; //Put it like this.    
    image = [self imageByScalingAndCroppingForSize:image toSize:CGSizeMake(256,256*image.size.height/image.size.width)];
    

    //调整图片大小

    或者你也可以在调整大小后放太喜欢,

    //----resize the images
    image = [self imageByScalingAndCroppingForSize:image toSize:CGSizeMake(256,256*image.size.height/image.size.width)];
    image  = [image fixOrientation]; //Put it like this.
    

    【讨论】:

    • 我是横向的,所以它会自动旋转图像吗?抱歉,对此有点陌生。
    • 是的,这将修复已采用的方向。到目前为止,我已经体验过该方法可以解决意外方向变化的问题。
    • 已经用了还是显示上图,我做错了什么?
    • 也看过这个链接,可以吗? stackoverflow.com/questions/10600613/…
    • 在同一个操作系统(即 MAC)上应该不是问题。在跨平台上,如该问题所述,它可能会显示不同的方向。即在 MAC 和 WINDOWS 上不同的方向。
    【解决方案3】:

    彻底解决了我的问题!

    我对图像方向感到非常沮丧,我的 ImageViews 也意外旋转了 90 度,直到我将代码中的一行从 PNG 更改为 JPEG(似乎保留了原始方向数据):

    我换了:

    let data = UIImagePNGRepresentation(imageView.image!)
    

    与:

    let data = UIImageJPEGRepresentation(imageView.image!, 100)
    

    感谢 Tomasz Nguyen MFMailComposeViewController image orientation 的相关回答一百万

    希望这可以帮助那里的人:)

    【讨论】:

      【解决方案4】:
      UIImage *temp = [UIImage imageWithCGImage:imgref scale:1.0f orientation:UIImageOrientationUp];
      

      【讨论】:

      • 我从其他方向拍摄的图像是什么?
      • 在您的答案中添加一些 cmets,以便 OP 更好地了解您正在使用建议的代码做什么
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      相关资源
      最近更新 更多