2010-05-07 10 views
10

Ich weiß also, Sie CGImage aus einer Datei bekommen kann UIImage mit ...Wie kann ich einen CGImageRef aus einer Datei bekommen?

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

Aber ist es eine Möglichkeit, ein CGImageRef ohne Verwendung eines UIImage zu bekommen?

(Ich versuche dies in einer statischen Bibliothek, die keinen Zugriff auf UIKit hat) Ich könnte andere Frameworks bei Bedarf verwenden, nur nicht UIKit. Würde CIImage funktionieren? Oder NSBitmapImageRep?

+0

ImageIO.framework wird verfügbar sein, aber sonst kann man BMP nicht einfach durch reine CG-Funktionen lesen. – kennytm

+0

Aus Neugier, was ist der Schaden beim Laden des Bildes von UIImage? Gibt es einen signifikanten Unterschied in der Erinnerung? – MrHen

+0

Ich mache das in einem Komponententest. Unsere statische Lib, die wir schreiben, nimmt ein CGImageRef. Ich möchte es testen, indem ich einen von einer Testdatei übergebe, die ich habe. Ich habe versucht, UIKit in meinem Unit-Test-Projekt zu laden und die UIImage-Methode zu tun, aber es hat nie funktioniert. Ich nehme an, es ist, weil mein Unit-Test-Projekt keine View-Anwendung ist –

Antwort

18

Sie können es von NSData erhalten:

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

Sie würden sicher sein, dass die Daten ein JPEG oder ein PNG hierfür war zu arbeiten.

+0

süß! Vielen Dank! Weißt du, ob es einen Weg gibt, dies für einen BMP zu tun? Es gibt keinen CGImageCreateWithBMPDataProvider ... –

+0

Nein, tut mir leid, ich denke, du musst die UIImage-Route dafür durchgehen :( –

+0

Das hat mir wirklich geholfen, aber du solltest wissen, dass du den Speicher freigeben musst, der den '' enthält CGImageRef' mit dem folgenden 'CGImageRelease (image);' – taymless

1

Sie müssen verstehen, dass die Verwendung von [UIImage imageNamed: @ "name.bmp"] über UIKit Framework funktioniert. Dies ist nicht Thread-sicher. Beispiel für dispatch_apply Sie müssen das Quartz-Framework verwenden.

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