CGContextDrawImage:加载灰度图像时无效的上下文0x0

时间:2015-04-02 14:06:44

标签: ios xcode quartz-graphics

我正在使用xcode,并希望将灰度图像加载到程序中,但我遇到了问题。

之前我已经将灰度级的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通道的灰度图像时,我有一些问题。

我试图将colorSpace更改为CGColorSpaceCreateDeviceGray(),将通道数从4更改为1并注释掉cvCvtColor并直接返回IplImage * iplimage

但是,我仍然有错误,CGContextDrawImage:无效的上下文0x0

我认为CGBitmapContextCreate可能存在问题,而且bitmapInfo可能有问题。

我尝试了一些组合,例如kCGBitmapByteOrderDefault | kCGImageAlphaNone,但它们都不起作用。

知道我该怎么办吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

查看 CGBitmapContextCreate 的文档。 (在xCode CMD +右键单击我想看文档)

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

CGContextRef CGBitmapContextCreate(void * data,size_t width,size_t height,size_t bitsPerComponent,size_t bytesPerRow,CGColorSpaceRef space,CGBitmapInfo bitmapInfo);