CGBitmapContextCreate возвращает NULL

При каких обстоятельствах 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). Эта проблема имеет только правая сторона (т.е. Вторая попытка). Первая попытка все еще работает.

Ответ 1

Это может произойти, если size.width и/или size.height равно 0. Поместите a NSLog, чтобы проверять размеры каждый раз, когда вы вызываете этот метод, чтобы увидеть, что этот случай.

Ответ 2

Для потомков это также может произойти, если вы укажете "bytesPerRow", который недостаточно велик для размещения указанной ширины.

Использование примера кода Apple из https://developer.apple.com/library/ios/qa/qa1702/_index.html

Я заметил, что возвращаемые CVPixelBufferGetWidth(), CVPixelBufferGetHeight() и CVPixelBufferGetBytesPerRow() возвращали соответственно 1280, 720 и 1960. Значение "bytesPerRow" здесь (1960) не достаточно велико, чтобы содержать все байты для изображения шириной 1280 пикселей. Похоже, что это, вероятно, ошибка в API Apple.

Поэтому вместо использования значения, возвращаемого CVPixelBufferGetBytesPerRow(), я использовал 'width * 4', и это сработало просто отлично!