2010-11-24 10 views
4

Ich verwende einen Code, um zwischen iplimage und uiimage zu konvertieren. Ich nehme ein Foto von der Kamera (ein UIImage) und wandle es mit dem unten angegebenen Code in ein ipimage und zurück um. Leider wird dadurch das Bild um 90 Grad gedreht und gestreckt. also, wenn ich ein 320x480 Bild nehme, kommt ein 320x480 Bild zurück, aber das Bild wurde gedreht und neu skaliert, so dass es aussieht als wäre es um 90 Grad gedreht (also ein 480x320 Bild) dann ungleichmäßig skaliert ... ich kann nicht sehen it out - alles scheint richtig (Byteanordnung usw.)Iphone Konvertieren von IplImage in UIImage und zurück verursacht 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

Ich hatte diesen Fehler auftritt, wenn ich versuche IplImage von UIImage konvertieren : CGImageCreate: ungültiges Bild Bits/Pixel: 8. Was ist das Problem? – chostDevil

+0

Ja, ich bekomme das gleiche Problem wie ChostDevil. –

+0

Hat jemand das herausgefunden? –

Antwort

4

ich hatte das gleiche Problem, auch, und ich habe immer noch nicht herausfinden, wie die beiden Methoden zu ändern, so dass sie das Bild nicht drehen.

Stattdessen drehte ich die UIImague, z. mein Code sieht wie folgt aus:

//Change the rotation here 

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

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

Gerade

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

in:

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

Ich hatte das gleiche Problem und ich die Lösung gefunden - Änderung CreateIplImageFromUIImage wie folgt aus:

- (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

Das funktioniert nicht für mich. –