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)