2013-06-20 2 views
0

У меня есть UIImage, который поступает из Camera Roll. У меня есть следующий код:Проблема ориентации UIImage при вызове UIImageJPEGпредставление

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

Когда я просматриваю img в UIImageView, ориентация верна. Однако после возвращения объекта NSData из представления UIImageJPEG некоторые изображения появляются вверх ногами (не все из них, только некоторые из них).

Я нашел код, который должен исправить, но он не работает для меня, потому что те, которые появляются вверх ногами, возвращают ориентацию UP, поэтому код не выполняется. Код, который я пытался использовать это:

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 бы повлиять на ориентацию?

Заранее спасибо.

ответ

-1

Поскольку UIImageJPEGRепредставление UIImage отбрасывает большую часть метаданных UIImage, включая информацию об изображении. Вы должны добавить информацию о ориентации назад после преобразования в JPEG, но перед сохранением изображения. В противном случае все ваши JPEG будут сообщать, что они ориентированы Up.

Теперь, как на самом деле добавить, что я не знаю ... начать с How to write orientation data to the UIImage iOS SDK и Problem setting exif data for an image и iOS UIImagePickerController result image orientation after upload