【问题标题】:Iphone Converting IplImage to UIImage and back causes rotationIphone 将 IplImage 转换为 UIImage 并返回会导致旋转
【发布时间】:2011-05-14 21:12:49
【问题描述】:

我正在使用一些代码在 iplimage 和 uiimage 之间进行转换。我拍摄了一张从相机拍摄的照片(UIImage),然后使用下面发布的代码将其转换为 iplimage 并返回。不幸的是,这会导致图像旋转并拉伸 90 度。 因此,如果我拍摄 320x480 图像,它会返回 320x480 图像,但图像已被旋转并重新缩放,使其看起来好像旋转了 90 度(即 aa 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;
}

【问题讨论】:

  • 当我尝试从 UIImage 转换 IplImage 时出现此错误 : CGImageCreate: invalid image bits/pixel: 8. 有什么问题?
  • 是的,我遇到了与 chostDevil 相同的问题。
  • 有人知道这个吗?

标签: iphone opencv uiimage iplimage


【解决方案1】:

我也遇到了同样的问题,但我仍然没有找到如何更改这两种方法以使它们不旋转图片。

相反,我旋转了 UIImage,例如我的代码如下所示:

//Change the rotation here

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

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

【讨论】:

    【解决方案2】:

    只是改变

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

    进入:

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

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,我找到了解决方案 - 像这样更改 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-08
        • 2013-11-29
        • 2011-11-25
        • 2015-11-24
        • 2018-06-25
        • 1970-01-01
        • 1970-01-01
        • 2011-09-08
        相关资源
        最近更新 更多