Pertanyaan Iphone Konversi IplImage ke UIImage dan kembali menyebabkan rotasi


Saya menggunakan beberapa kode untuk mengkonversi antara iplimage dan uiimage. Saya mengambil foto yang diambil dari kamera (UIImage) dan mengubahnya menjadi iplimage dan kembali menggunakan kode yang diposting di bawah ini. Sayangnya ini menyebabkan gambar diputar dan direnggangkan hingga 90 derajat. jadi jika saya mengambil gambar 320x480, itu akan menghasilkan gambar 320x480 tetapi gambar telah dirotasi dan dikompresi ulang sehingga tampak seolah-olah diputar 90 derajat (yaitu gambar 480x320) kemudian diskalakan secara tidak merata ... Saya tidak dapat membayangkannya keluar - semuanya tampak benar (pemesanan byte dll.)

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

4
2017-11-24 04:07


asal


Jawaban:


Saya memiliki masalah yang sama, juga dan saya masih tidak tahu bagaimana mengubah dua metode sehingga mereka tidak memutar gambar.

Sebaliknya saya memutar UIImage, mis. kode saya terlihat seperti ini:

//Change the rotation here

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

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

4
2018-01-18 11:44



Ganti saja

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

ke:

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

4
2018-05-25 12:51



Saya memiliki masalah yang sama dan saya menemukan solusinya - berubah CreateIplImageFromUIImage seperti ini:

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

1
2018-05-19 08:35