2010-08-21 10 views
5

Recibo errores EXEC_BAD_ACCESS en una llamada CGContextDrawImage y trato de rastrearlo. Tengo una imagen PNG y ejecuto una UIImagePNGRpresentación o me da instancia de NSData.Cómo convertir NSData a CGDataProviderRef en iphone sdk?

Necesito convertir esto a la instancia CGImageRef, así que puedo ejecutar el método CGImageCreateWithPNGDataProvider con este CGImageRef.

Intenté dos formas: 1) Para lanzarlo.

CGImageRef ref = (CGDataProvider) nsdata;

2) Para ejecutar CGDataProviderCreateWithCFData (nsdata);

El primer caso devuelve la imagen vacía, aunque el comando no falla. La razón por la que probé el segundo caso, aunque tengo NSData y no CFData, es porque recuerdo haber leído ambos. Cualquiera sea la razón, está fallando debido a esto.

¿Hay alguna forma de que pueda usar mi PNG NSData para crear una CGImage que no esté dañada? Por favor ayuda.

THanks

Respuesta

3

La primera es muy incorrecta. No puede convertir una instancia NSData en CGImageRef simplemente lanzándola.

El segundo debería funcionar bien. Tendrá que convertir la instancia NSData en CFDataRef, pero eso es perfectamente legal debido a lo que Apple llama al puenteo sin cargo.

Aquí es otra y el método más fácil:

NSData* data = ... get raw image data from somewhere (PNG, JPEG, etc.) ...; 
UIImage* image = [UIImage imageWithData: data]; 
CGImageRef imageRef = image.CGImage; 

yo prefiero usar el nivel más alto UIImage métodos para cargar imágenes y luego usar image.CGImage de nivel inferior funciones núcleo de gráficos. No olvide retener correctamente el UIImage si necesita mantenerlo.

+0

'image.CGImage' es definitivamente mejor que' [(id) CGImageCreateWithPNGDataProvider ((CGDataProviderRef) [(id) CGDataProviderCreateWithNSData ((CFDataRef) UIImagePNGRepresentation (imagen)) autorelease (CGImageRef) ], 0,0,0) liberación automática] ' –

+1

Tenga en cuenta que UIKit no es seguro para subprocesos, por lo que la creación de instancias' UIImage' en subprocesos de fondo puede ocasionar problemas. En algunos casos, es mejor crear directamente un 'CGImageRef'. – cheeesus

+0

@cheeesus, de acuerdo con la documentación de Apple (https://developer.apple.com/reference/uikit/uiimage), es seguro crear instancias de UIImage en hilos de fondo: * "La naturaleza inmutable de los objetos de imagen también significa que son seguro para crear y usar desde cualquier hilo. "* – Arda

9

Su segundo intento es casi correcto. CFData y NSData son "puente sin cargo". Cualquier cosa que acepte CFDataRef también acepta NSData (y viceversa); solo tiene que lanzar correctamente.

que necesita:

CGDataProviderCreateWithCFData((CFDataRef)myNSData); 
+2

Si tiene ARC, use __bridge para convertir directamente: CGDataProviderCreateWithCFData ((__ bridge CFDataRef) myNSData); – situee