2010-05-07 16 views
10

así que sé se puede obtener una CGImage de un archivo usando UIImage ...¿Cómo puedo obtener un CGImageRef de un archivo?

UIImage *img = [UIImage imageNamed:@"name.bmp"]; 
[img CGImage]; 

Pero, ¿hay una manera de conseguir un CGImageRef sin utilizar un UIImage?

(Estoy intentando esto en una biblioteca estática que no tiene acceso a UIKit) Podría usar otros frameworks si es necesario, simplemente no UIKit. ¿Funcionaría CIImage? O NSBitmapImageRep?

+0

ImageIO.framework estará disponible, pero de lo contrario no podrá leer un BMP simplemente por funciones CG puras. – kennytm

+0

Por curiosidad, ¿cuál es el daño al cargar la imagen de UIImage? ¿Hay una diferencia de memoria significativa? – MrHen

+0

Estoy haciendo esto en una prueba unitaria. Nuestra lib estática que estamos escribiendo tiene un CGImageRef. Quiero probarlo pasando una entrada de un archivo de prueba que tengo. Intenté cargar UIKit en mi proyecto de prueba de unidad y hacer el UIImage, pero nunca funcionó. Supongo que es porque mi proyecto de prueba de la unidad no es una aplicación de vista –

Respuesta

18

Puede obtenerlo de NSData:

CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData((CFDataRef)[NSData dataWithContentsOfFile:@""]); 
CGImageRef image = CGImageCreateWithPNGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault); // Or JPEGDataProvider 

Usted tendría que estar seguro de que los datos eran un JPEG o PNG para que esto funcione.

+0

dulce! ¡Gracias! ¿Sabes si hay una manera de hacer esto para un BMP? No hay CGImageCreateWithBMPDataProvider ... –

+0

No, lo siento, creo que tendrás que pasar por la ruta UIImage para eso :( –

+0

Esto realmente me ayudó, pero debes saber que tienes que liberar la memoria que contiene el ' CGImageRef' con el siguiente 'CGImageRelease (imagen);' – taymless

1

Tienes que entender que usar [UIImage imageNamed: @ "name.bmp"] funciona a través de UIKit framework. Esto no es seguro para subprocesos. Ejemplo para dispatch_apply debes usar Quartz framework.

// Through Quartz 
NSString *maskFilePath = [[NSBundle mainBundle] pathForResource:@"mask" ofType:@"png"]; 
CGDataProviderRef dataProvider = CGDataProviderCreateWithFilename([maskFilePath UTF8String]); 
CGImageRef maskRef = CGImageCreateWithPNGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); 
Cuestiones relacionadas