我正在使用xcode,并希望将灰度图像加载到程序中,但我遇到了问题。
之前我已经将灰度级的IplImage(大小,8,1)转换为UIimage并存储为jpg。现在我想恢复过程以取回IplImage。
我通过
获取UIimageUIImage *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,但它们都不起作用。
知道我该怎么办吗?提前谢谢!
答案 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);