0

这个问题的标题应该很清楚。下面的代码执行裁剪操作,然后在图像视图中显示新裁剪的照片。问题是图像一旦被裁剪,就会以与原始源图像不同的方向显示。这是为什么?我该怎么办?

-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[self.popoverController dismissPopoverAnimated:true];

NSString *mediaType = [info
                       objectForKey:UIImagePickerControllerMediaType];
[self dismissModalViewControllerAnimated:YES];
if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
    UIImage *image = [info
                      objectForKey:UIImagePickerControllerOriginalImage];


    CGRect rect = CGRectMake(0, ((image.size.height - image.size.width) / 2), image.size.width, image.size.width);


    CGImageRef subImageRef = CGImageCreateWithImageInRect(image.CGImage, rect);
    CGRect smallBounds = CGRectMake(rect.origin.x, rect.origin.y, CGImageGetWidth(subImageRef), CGImageGetHeight(subImageRef));

    UIGraphicsBeginImageContext(smallBounds.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, smallBounds, subImageRef);
    croppedImage = [UIImage imageWithCGImage:subImageRef];
    UIGraphicsEndImageContext();

    imageView.image = croppedImage;

*编辑

根据建议问题的根本原因是删除 EXIF 标签的评论,我尝试使用以下代码更正方向。这仍然不能解决问题,但我认为这是朝着正确方向迈出的一步。也许它会帮助某人为这个问题提出一个新的答案。

if (image.imageOrientation == UIImageOrientationLeft) {
        NSLog(@"left");
        CGContextRotateCTM (context, radians(90));

    } else if (image.imageOrientation == UIImageOrientationRight) {
        NSLog(@"right");
        CGContextRotateCTM (context, radians(-90));

    } else if (image.imageOrientation == UIImageOrientationUp) {
        NSLog(@"up");
        // NOTHING
    } else if (image.imageOrientation == UIImageOrientationDown) {
        NSLog(@"down");
        CGContextRotateCTM (context, radians(-180.));
    }

https://stackoverflow.com/a/5184134/549273

4

2 回答 2

0

我认为您最好的选择是从传入的图像中获取方向,然后使用适当的旋转创建新图像。

从传入的信息字典中获取元数据:

NSDictionary *metadata = [info objectForKey:UIImagePickerControllerMediaMetadata];
NSNumber *orientation = [metadata objectForKey:@"Orientation"];

然后当你创建你的UIImage

croppedImage = [UIImage imageWithCGImage:subImageRef 
                                   scale:1.0 
                             orientation:[orientation intValue]];

希望这对你来说是一个起点,至少。

于 2012-10-10T10:40:29.530 回答
0

你应该做的是在应对之前修复图像方向,我遇到了同样的问题,我正在使用 swift 所以我不得不改变这个答案:

上传后iOS UIImagePickerController结果图像方向

但是代码工作得很好。请记住,它返回一个图像而不是编辑图像,因为那个简单的错误,我努力让它正确。顺便说一句,你不应该使用 UIImageOrientation 而是 UIImageOrientation.rawValue,至少在 swift 中是这样。

我将在此处留下 swift 的代码,希望对您有所帮助:

extension UIImage {
public func fixOrientation() -> UIImage?{

    if self.imageOrientation.rawValue == UIImageOrientation.Up.rawValue {
        return self
    }

    var transform : CGAffineTransform = CGAffineTransformIdentity

    switch self.imageOrientation.rawValue {

    case UIImageOrientation.Down.rawValue:
            transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI))
    case UIImageOrientation.DownMirrored.rawValue:
            transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI))

    case UIImageOrientation.Left.rawValue:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2))
    case UIImageOrientation.LeftMirrored.rawValue:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2))

    case UIImageOrientation.Right.rawValue:
            print("working on right orientation")
            transform = CGAffineTransformTranslate(transform, 0, self.size.height)
            transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2))
    case UIImageOrientation.RightMirrored.rawValue:
            transform = CGAffineTransformTranslate(transform, 0, self.size.height)
            transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2))

    case UIImageOrientation.Up.rawValue: break
    case UIImageOrientation.UpMirrored.rawValue: break

    default: break
    }

    switch self.imageOrientation.rawValue {

    case UIImageOrientation.UpMirrored.rawValue:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0)
            transform = CGAffineTransformScale(transform, -1, 1)
    case UIImageOrientation.DownMirrored.rawValue:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0)
            transform = CGAffineTransformScale(transform, -1, 1)

    case UIImageOrientation.LeftMirrored.rawValue:
            transform = CGAffineTransformTranslate(transform, self.size.height, 0)
            transform = CGAffineTransformScale(transform, -1, 1)
    case UIImageOrientation.RightMirrored.rawValue:
            transform = CGAffineTransformTranslate(transform, self.size.height, 0)
            transform = CGAffineTransformScale(transform, -1, 1)

    case UIImageOrientation.Up.rawValue: break
    case UIImageOrientation.Down.rawValue: break
    case UIImageOrientation.Left.rawValue: break
    case UIImageOrientation.Right.rawValue: break

    default: break
    }

    let bitmapInfo = CGImageGetBitmapInfo(self.CGImage)

    let ctx = CGBitmapContextCreate(nil, Int(self.size.width), Int(self.size.height), CGImageGetBitsPerComponent(self.CGImage), 0, CGImageGetColorSpace(self.CGImage),
        bitmapInfo.rawValue)

    CGContextConcatCTM(ctx, transform)

    switch self.imageOrientation {

    case UIImageOrientation.Left:
            CGContextDrawImage(ctx, CGRectMake(0, 0, self.size.height, self.size.width), self.CGImage)
    case UIImageOrientation.LeftMirrored:
            CGContextDrawImage(ctx, CGRectMake(0, 0, self.size.height, self.size.width), self.CGImage)
    case UIImageOrientation.Right:
            CGContextDrawImage(ctx, CGRectMake(0, 0, self.size.height, self.size.width), self.CGImage)
    case UIImageOrientation.RightMirrored:
            CGContextDrawImage(ctx, CGRectMake(0, 0, self.size.height, self.size.width), self.CGImage)

    default:
        CGContextDrawImage(ctx, CGRectMake(0, 0, self.size.width, self.size.height), self.CGImage)

    }

    let cgimg = CGBitmapContextCreateImage(ctx)
    let image = UIImage(CGImage: cgimg!)

    return image

    }
}
于 2016-05-11T04:48:07.280 回答