2010-11-24 3 views
4

J'utilise du code pour convertir entre iplimage et uiimage. Je prends une photo prise de la caméra (un UIImage) et la convertis en iplimage et en utilisant le code ci-dessous. Malheureusement, cela provoque une rotation et une extension de l'image de 90 degrés. donc si je prends une image 320x480 il revient une image 320x480 mais l'image a été tournée et redimensionnée de manière à ce qu'elle semble avoir été tournée de 90 degrés (soit une image 480x320) puis redimensionnée de façon non uniforme ... Je ne peux pas comprendre it out - tout semble juste (octet commande, etc.)Iphone Convertir IplImage à UIImage et retour provoque la rotation

+(IplImage *)CreateIplImageFromUIImage:(UIImage *)image { 
CGImageRef imageRef = image.CGImage; 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
IplImage *iplimage = cvCreateImage(cvSize(image.size.width, image.size.height), IPL_DEPTH_8U, 4); 
CGContextRef contextRef = CGBitmapContextCreate(iplimage->imageData, iplimage->width, iplimage->height, 
               iplimage->depth, iplimage->widthStep, 
               colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault); 
CGContextDrawImage(contextRef, CGRectMake(0, 0, image.size.width, image.size.height), imageRef); 
CGContextRelease(contextRef); 
CGColorSpaceRelease(colorSpace); 

return iplimage; 
} 

+(UIImage *)UIImageFromIplImage:(IplImage *)image { 
NSLog(@"IplImage (%d, %d) %d bits by %d channels, %d bytes/row %s", image->width, image->height, image->depth, image->nChannels, image->widthStep, image->channelSeq); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
NSData *data = [NSData dataWithBytes:image->imageData length:image->imageSize]; 
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data); 
CGImageRef imageRef = CGImageCreate(image->width, image->height, 
            image->depth, image->depth * image->nChannels, image->widthStep, 
            colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault, 
            provider, NULL, false, kCGRenderingIntentDefault); 
UIImage *ret = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationRight]; 
CGImageRelease(imageRef); 
CGDataProviderRelease(provider); 
CGColorSpaceRelease(colorSpace); 
return ret; 
} 
+0

j'avais cette erreur se produit lorsque je tente pour convertir IplImage de UIImage : CGImageCreate: bits d'image/pixel invalides: 8. quel est le problème? – chostDevil

+0

Oui, j'ai le même problème que chostDevil. –

+0

Est-ce que quelqu'un a compris cela? –

Répondre

4

J'ai eu le même problème, aussi, et je ne trouve pas encore comment changer les deux méthodes afin qu'ils ne tournent pas l'image.

Au lieu de cela j'ai fait tourner le UIImage, par ex. mon code ressemble à ceci:

//Change the rotation here 

UIImage *imageCam= [UIImage imageWithCGImage:newImage scale:1.0 orientation:UIImageOrientationUp]; 

//Convert UIImage 
IplImage *image = [self CreateIplImageFromUIImage:imageCam]; 
4

Juste changer

UIImage *ret = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationRight]; 

dans:

UIImage *ret = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationUp]; 
1

J'ai eu le même problème et j'ai trouvé la solution - changement CreateIplImageFromUIImage comme ceci:

- (IplImage *)CreateIplImageFromUIImage:(UIImage *)image { 

    CGImageRef imageRef = [self rotateImage:image].CGImage; 
     ........... 
} 

- (UIImage*)rotateImage:(UIImage *)image { 
    int kMaxResolution = 320; 
    // Or whatever  
    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; 
} 
+0

Cela ne fonctionne pas pour moi. –