Ответ 1
Это может произойти, если size.width
и/или size.height
равно 0. Поместите a NSLog
, чтобы проверять размеры каждый раз, когда вы вызываете этот метод, чтобы увидеть, что этот случай.
При каких обстоятельствах 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). Эта проблема имеет только правая сторона (т.е. Вторая попытка). Первая попытка все еще работает.
Это может произойти, если size.width
и/или size.height
равно 0. Поместите a NSLog
, чтобы проверять размеры каждый раз, когда вы вызываете этот метод, чтобы увидеть, что этот случай.
Для потомков это также может произойти, если вы укажете "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', и это сработало просто отлично!