【问题标题】:CGBitmapContextCreate returns NULLCGBitmapContextCreate 返回 NULL
【发布时间】:2012-06-05 09:53:49
【问题描述】:

什么情况下CGBitmapContext会分配失败?我有一个表格视图,它有多个视图选项。用户可以看到一个只有预览的小表格单元格、每行一个较大的预览或每行两个并排的预览。前两个渲染得很好,但第三个失败了。 CGBitmapContextCreate 没有错误消息,只是在我尝试使用它之后出现错误(即无效上下文 0x0)。

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
//size is a passed parameter
CGContextRef c = CGBitmapContextCreate(NULL, size.width, size.height, 8, size.width*4, colorSpace, kCGImageAlphaNoneSkipLast);
CGColorSpaceRelease(colorSpace);

我的目标是 iOS 5.0,使用 5.1 构建。工作版和非工作版的唯一区别是非工作版会尝试做两次(尺寸很小,小于 100x100)。 只有右侧有这个问题(即第二次尝试)。第一次尝试仍然有效。

【问题讨论】:

    标签: ios core-graphics cgbitmapcontextcreate


    【解决方案1】:

    如果size.width 和/或size.height 为0,则可能发生这种情况。每次调用此方法时,请使用NSLog 检查大小,看看是否是这种情况。

    【讨论】:

    • 啊,太好了。我以为我检查了这些,但显然还不够好。其中一些实际上是 0。做得好,谢谢!!
    【解决方案2】:

    对于后代,如果您指定的“bytesPerRow”不足以容纳指定的宽度,也会发生这种情况。

    使用来自https://developer.apple.com/library/ios/qa/qa1702/_index.html的Apple示例代码

    我注意到返回的 CVPixelBufferGetWidth()、CVPixelBufferGetHeight() 和 CVPixelBufferGetBytesPerRow() 分别返回 1280、720 和 1960。此处的“bytesPerRow”值(1960 年)不足以容纳 1280 像素宽的图像的所有字节。似乎这可能是Apple API中的一个错误。

    所以我没有使用 CVPixelBufferGetBytesPerRow() 返回的值,而是使用了 'width * 4',这很好用!

    【讨论】:

    • 感谢您提供更多信息!就像一个小警告一样,只要您使用 RGBA 或类似的每像素 4 字节模型,它只会是宽度 * 4。另外,您提到的数字不是错误。该函数返回在硬件上使用的每行正确的字节数(在内存中不一定正确)。正在讨论here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多