2010-11-24 3 views
4

Я использую код для преобразования между iplimage и uiimage. Я делаю снимок, снятый с камеры (UIImage), и преобразую его в iplimage и обратно, используя код, указанный ниже. К сожалению, это приводит к тому, что изображение поворачивается и растягивается на 90 градусов. , так что если я возьму изображение 320x480, оно вернет изображение 320x480, но изображение будет повернуто и изменено, чтобы оно выглядело так, как будто оно повернулось на 90 градусов (то есть изображение 480x320), затем масштабировалось неравномерно ... Я не могу изобразить это из - все кажется правильным (порядок байтов и т.д.)Iphone Преобразование IplImage в UIImage и обратно вызывает вращение

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

У меня была эта ошибка, когда я пытаюсь для преобразования IplImage из UIImage : CGImageCreate: недопустимые биты изображения/пиксель: 8. В чем проблема? – chostDevil 2012-04-24 13:17:24

+0

Да, у меня такая же проблема, как у chostDevil. – 2013-02-21 19:57:17

ответ

4

у меня была такая же проблема, тоже, и я до сих пор не нашли, как изменить эти два метода так, чтобы они не повернуть изображение.

Вместо этого я повернул UIImage, например. мой код выглядит следующим образом:

//Change the rotation here 

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

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

Просто измените

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

в:

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

У меня была такая же проблема, и я нашел решение - изменение CreateIplImageFromUIImage так:

- (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; 
} 
Смежные вопросы