2015-04-02 76 views
0

我使用Xcode并想将灰度图像加载到程序中,但我遇到了问题。CGContextDrawImage:当加载灰度图像时无效的上下文0x0

此前我已经将灰度IplImage(大小,8,1)转换为UIimage并存储为jpg。现在我想恢复过程来取回IplImage。

我获得的UIImage做

UIImage *uiimage1 = [UIImage imageNamed:@"IMG_1.JPG"]; 

然后我用下面的函数。

- (IplImage *)CreateIplImageFromUIImage:(UIImage *)image { 
// Getting CGImage from UIImage 
CGImageRef imageRef = image.CGImage; 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
// Creating temporal IplImage for drawing 
IplImage *iplimage = cvCreateImage(
            cvSize(image.size.width,image.size.height), IPL_DEPTH_8U, 4 
            ); 
// Creating CGContext for temporal IplImage 
CGContextRef contextRef = CGBitmapContextCreate(
               iplimage->imageData, iplimage->width, iplimage->height, 
               iplimage->depth, iplimage->widthStep, 
               colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault 
               ); 
// Drawing CGImage to CGContext 
CGContextDrawImage(
        contextRef, 
        CGRectMake(0, 0, image.size.width, image.size.height), 
        imageRef 
        ); 
CGContextRelease(contextRef); 
CGColorSpaceRelease(colorSpace); 

// Creating result IplImage 
IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3); 
cvCvtColor(iplimage, ret, CV_RGBA2BGR); 
cvReleaseImage(&iplimage); 

return ret; 

}

也能正常工作,用于与标准的RGBA通道加载彩色图像,但是我有一些问题时,我想只用1个频道并没有alpha通道来加载灰度图像。

我试图然而改变色彩空间到CGColorSpaceCreateDeviceGray(),改变从4到1信道的数量和注释掉cvCvtColor和返回的IplImage *的IplImage直接

,我仍然有错误,CGContextDrawImage:无效背景为0x0

我觉得可能是有CGBitmapContextCreate和可能出毛病BITMAPINFO一个问题..

我尝试了一些组合,如kCGBitmapByteOrderDefault | kCGImageAlphaNone但他们没有工作。

任何想法我该怎么做,请吗?提前致谢!

回答

0

调查CGBitmapContextCreate的文档。 (在xCode CMD +右键点击我认为看到文档)

你是否设置size_t bytesPerRow为这种情况? RGBA是8 + 8 + 8 + 8位长,只有Alpha是8

CGContextRef CGBitmapContextCreate(无效*数据,为size_t宽度,为size_t高度,为size_t bitsPerComponent,为size_t bytesPerRow,CGColorSpaceRef空间,CGBitmapInfo BITMAPINFO);