【问题标题】:UIImage orientation issue when calling UIImageJPEGRepresentation调用 UIImageJPEGRepresentation 时的 UIImage 方向问题
【发布时间】:2013-06-20 10:30:08
【问题描述】:

我有一个来自相机胶卷的 UIImage。我有以下代码:

UIImage *img = [UIImage imageWithCGImage: [[asset defaultRepresentation] fullResolutionImage]];
return UIImageJPEGRepresentation(img, 1.0);

当我在 UIImageView 中查看 img 时,方向是正确的。但是,在我从 UIImageJPEGRepresentation 返回 NSData 对象后,一些图像会出现颠倒(不是全部,只是其中一些)。

我找到了应该修复它的代码,但它对我不起作用,因为出现颠倒的代码会返回向上的方向,因此代码不会执行。我尝试使用的代码是:

if (image.imageOrientation == UIImageOrientationUp) return image;
CGAffineTransform transform = CGAffineTransformIdentity;

switch (image.imageOrientation) {
    case UIImageOrientationDown:
    case UIImageOrientationDownMirrored:
        transform = CGAffineTransformTranslate(transform, image.size.width, image.size.height);
        transform = CGAffineTransformRotate(transform, M_PI);
        break;

    case UIImageOrientationLeft:
    case UIImageOrientationLeftMirrored:
        transform = CGAffineTransformTranslate(transform, image.size.width, 0);
        transform = CGAffineTransformRotate(transform, M_PI_2);
        break;

    case UIImageOrientationRight:
    case UIImageOrientationRightMirrored:
        transform = CGAffineTransformTranslate(transform, 0, image.size.height);
        transform = CGAffineTransformRotate(transform, -M_PI_2);
        break;
    case UIImageOrientationUp:
    case UIImageOrientationUpMirrored:
        break;
}

switch (image.imageOrientation) {
    case UIImageOrientationUpMirrored:
    case UIImageOrientationDownMirrored:
        transform = CGAffineTransformTranslate(transform, image.size.width, 0);
        transform = CGAffineTransformScale(transform, -1, 1);
        break;

    case UIImageOrientationLeftMirrored:
    case UIImageOrientationRightMirrored:
        transform = CGAffineTransformTranslate(transform, image.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, image.size.width, image.size.height,
                                         CGImageGetBitsPerComponent(image.CGImage), 0,
                                         CGImageGetColorSpace(image.CGImage),
                                         CGImageGetBitmapInfo(image.CGImage));
CGContextConcatCTM(ctx, transform);
switch (image.imageOrientation) {
    case UIImageOrientationLeft:
    case UIImageOrientationLeftMirrored:
    case UIImageOrientationRight:
    case UIImageOrientationRightMirrored:
        // Grr...
        CGContextDrawImage(ctx, CGRectMake(0,0,image.size.height,image.size.width), image.CGImage);
        break;

    default:
        CGContextDrawImage(ctx, CGRectMake(0,0,image.size.width,image.size.height), image.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;

任何想法为什么 UIImageJPEGRepresentation 会影响方向?

提前致谢。

【问题讨论】:

    标签: uiimage uiimagejpegrepresentation


    【解决方案1】:

    因为 UIImage 的 UIImageJPEGRepresentation 丢弃了大部分 UIImage 元数据,包括 imageOrientation 信息。您必须在转换为 JPEG 之后但在存储图像之前重新添加方向信息。否则,您的所有 JPEG 文件都会报告它们已定向向上。

    现在如何实际添加,我不知道...从 How to write orientation data to the UIImage iOS SDKProblem setting exif data for an imageiOS UIImagePickerController result image orientation after upload 开始

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-10
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多