Iphone Преобразование IplImage в UIImage и обратно вызывает вращение - PullRequest
4 голосов
/ 24 ноября 2010

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

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

Ответы [ 3 ]

4 голосов
/ 25 мая 2011

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

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

в

UIImage *ret = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationUp];
4 голосов
/ 18 января 2011

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

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

//Change the rotation here

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

//Convert UIImage
IplImage *image = [self CreateIplImageFromUIImage:imageCam];
1 голос
/ 19 мая 2012

У меня была такая же проблема, и я нашел решение - измените 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;
}
...