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

Posted

技术标签:

【中文标题】CGContextDrawImage:加载灰度图像时上下文 0x0 无效【英文标题】:CGContextDrawImage: invalid context 0x0 when loading grayscaled image 【发布时间】:2015-04-02 14:06:43 【问题描述】:

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

之前我已将灰度 IplImage(size,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: invalid context 0x0

我认为 CGBitmapContextCreate 可能有问题,并且 bitmapInfo 可能有问题..

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

知道我应该怎么做吗?提前致谢!

【问题讨论】:

【参考方案1】:

查看 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 );

【讨论】:

以上是关于CGContextDrawImage:加载灰度图像时上下文 0x0 无效的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 CGContextDrawImage 旋转图像比绘制旋转的 UIImage 慢得多?

与 CGContextDrawImage 相比,为啥 UIImageView 如此占用内存

python使用openCV图像加载(转化为灰度图像)使用equalizeHist算法增强灰度图像对比度可视化对比度增强之后的图像

python使用OpenCV加载图像为灰度图(图像原本为彩色图)并可视化灰度图像(Load image as grayscale and show image)

CGContextDrawImage 画大图很模糊

巨大的内存峰值 - CGContextDrawImage