2012-03-18 17 views
7

Estoy tomando algunas fotos de la biblioteca de fotos del iPad. Tomé algunas fotos de prueba en modo horizontal, ambas con el botón de inicio del iPad en el lado izquierdo y luego en el lado derecho.imageOrientation regresa hacia arriba, pero la foto aparece al revés

Por lo tanto, en mi aplicación, por alguna razón, algunas de las fotos aparecen al revés. Revisé su propiedad imageOrientation, y todos son 0 (lo que significa que son UIImageOrientationUp). Entonces eso significa que ni siquiera puedo decir qué fotos necesito rotar.

¿Qué está pasando y cómo puedo saber qué fotos deben girarse? Gracias

+0

ver esto https://github.com/cosnovae/fixUIImageOrientation –

+0

También puede hacer referencia puesto similar [Orientación de la imagen AVFoundation de 90 grados en la vista previa, pero bien en el rollo de la cámara] (http://stackoverflow.com/questions/15956750/avfoundation-image-orientation-off-by-90-degrees-in-the-preview-but-fine-in-came/16074603#16074603) –

Respuesta

4

Un UIImage tiene una propiedad imageOrientation, que indica a UIImageView y a otros consumidores de UIImage que roten los datos de imagen en bruto. Hay una gran posibilidad de que esta bandera se guarde en los datos exif en la imagen jpeg cargada, pero el programa que utiliza para verlo no respeta esa bandera.

para girar la UIImage para mostrar correctamente cuando se envían, puede utilizar una categoría como esta: En archivo .h

UIImagefixOrientation.h

@interface UIImage (fixOrientation) 

- (UIImage *)fixOrientation; 

@end 

UIImagefixOrientation.m

@implementation UIImage (fixOrientation) 

- (UIImage *)fixOrientation { 

    // No-op if the orientation is already correct 
    if (self.imageOrientation == UIImageOrientationUp) return self; 

    // 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 (self.imageOrientation) { 
     case UIImageOrientationDown: 
     case UIImageOrientationDownMirrored: 
     transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height); 
     transform = CGAffineTransformRotate(transform, M_PI); 
      break; 

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

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

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

    case UIImageOrientationLeftMirrored: 
    case UIImageOrientationRightMirrored: 
     transform = CGAffineTransformTranslate(transform, self.size.height, 0); 
     transform = CGAffineTransformScale(transform, -1, 1); 
     break; 
} 

// Now we draw the underlying CGImage into a new context, applying the transform 
// calculated above. 
CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height, 
             CGImageGetBitsPerComponent(self.CGImage), 0, 
             CGImageGetColorSpace(self.CGImage), 
             CGImageGetBitmapInfo(self.CGImage)); 
CGContextConcatCTM(ctx, transform); 
switch (self.imageOrientation) { 
    case UIImageOrientationLeft: 
    case UIImageOrientationLeftMirrored: 
    case UIImageOrientationRight: 
    case UIImageOrientationRightMirrored: 
     // Grr... 
     CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage); 
     break; 

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

@end 

Y llame a esta función durante la captura de imágenes guardadas o seleccione una imagen de la galería.

+1

Hola, gracias por tu función. Sin embargo, un posible problema es que todos los archivos invertidos devuelven UIImageOrientationUp. Ninguno de ellos devuelve nada más que 0, lo cual es problemático. – user339946

+0

me puedes enviar el código porque lo intentaré por mi parte.y resuelvo tu error. – parag

1

Sin entrar en su código de imagen, ¿podría ser debido al sistema de coordenadas volteado en iOS?

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaDrawingGuide/Transforms/Transforms.html

~ SNIP:

Configuración de la finalidad de aprovechar al Flipped Coordenadas

El primer paso que debe adoptar para aplicar las coordenadas volteado es decidir la orientación predeterminada de su ver. Si prefiere usar coordenadas volteadas, hay dos formas de configurar el sistema de coordenadas de su vista antes de dibujar:

Anule el método isFlipped de su vista y devuelva SÍ. Aplique una transformación flip a su contenido inmediatamente antes de renderizar.

Así pues, en su opinión, puede intentar añadir -(BOOL)isFlipped y volver YES y probar si hay alguna diferencia.

1

También estaba enfrentando el mismo problema. utilizar esta función para resolver:

- (UIImage *)scaleAndRotateImage:(UIImage *) image { 
int kMaxResolution = 320; 

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 = bounds.size.width/ratio; 
    } 
    else { 
     bounds.size.height = kMaxResolution; 
     bounds.size.width = 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; 
} 
Cuestiones relacionadas