2012-06-05 14 views
10

¿En qué circunstancias no se asignará un CGBitmapContext? Tengo una vista de tabla, y tiene múltiples opciones de visualización. El usuario puede ver una pequeña celda de la tabla con solo vistas previas, una vista previa más grande por línea o dos vistas preliminares una al lado de la otra por línea. Los dos primeros funcionan bien, pero el tercero falla. No hay mensajes de error de CGBitmapContextCreate, solo errores después de cuando intento usarlo (es decir, contexto no válido 0x0).CGBitmapContextCreate devuelve NULL

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

Me estoy orientando a iOS 5.0, compilando con 5.1. La única diferencia entre la versión que funciona y la que no funciona es que la versión que no funciona intenta hacerlo dos veces (el tamaño es pequeño, menos de 100x100). Solo el lado derecho tiene este problema (es decir, el segundo intento). El primer intento todavía funciona.

Respuesta

13

Esto puede suceder si size.width y/o size.height es 0. Ponga un NSLog para verificar los tamaños cada vez que llame a este método para ver si ese es el caso.

+1

Ah, excelente. Pensé que los revisé, pero al parecer no lo suficientemente bien. Algunos de ellos fueron, de hecho, 0. ¡Bien hecho, gracias! – borrrden

4

Para la posteridad, esto también puede suceder si especifica un 'bytesPerRow' que no es lo suficientemente grande para acomodar el ancho especificado.

El uso de código de ejemplo de Apple de https://developer.apple.com/library/ios/qa/qa1702/_index.html

Noté que CVPixelBufferGetWidth(), CVPixelBufferGetHeight(), y CVPixelBufferGetBytesPerRow() devuelve regresaban 1280, 720, y 1960, respectivamente. El valor 'bytesPerRow' aquí (1960) no es lo suficientemente ancho como para contener todos los bytes de una imagen de 1280 píxeles de ancho. Parece que esto es probablemente un error en la API de Apple.

Así que, en lugar de utilizar el valor devuelto por CVPixelBufferGetBytesPerRow(), utilicé 'width * 4', ¡y funcionó bien!

+1

¡Gracias por la información adicional! Al igual que una pequeña advertencia, solo tendrá un ancho * 4 siempre que utilice un modelo RGBA o similar de 4 bytes por píxel. Además, los números que mencionas no son un error. Esa función devuelve la cantidad correcta de bytes por fila utilizada * en hardware * (no necesariamente corregida en la memoria). Se discute [aquí] (https://developer.apple.com/library/ios/qa/qa1829/_index.html) – borrrden

Cuestiones relacionadas