2010-08-21 9 views
5

Ich bekomme EXEC_BAD_ACCESS Fehler in einem CGContextDrawImage-Aufruf und versuchen, es zurückzuverfolgen. Ich habe ein PNG-Image und eine UIImagePNGRepresentation o es gibt mir NSData-Instanz.Wie konvertiert man NSData in CGDataProviderRef auf iPhone SDK?

Ich muss dies in CGImageRef-Instanz konvertieren, damit ich die CGImageCreateWithPNGDataProvider-Methode mit diesem CGImageRef ausführen kann.

Ich habe versucht, zwei Möglichkeiten: 1) Um es zu werfen.

CGImageRef ref = (CGDataProvider) nsdata;

2) CGDataProviderCreateWithCFData (nsdata) ausführen;

Der erste Fall gibt ein leeres Bild zurück, obwohl der Befehl nicht fehlschlägt. Der Grund, warum ich den zweiten Fall ausprobiert habe, obwohl ich NSData und nicht CFData habe, ist, weil ich mich daran erinnere, beide zu lesen. Was auch immer der Grund sein mag, es scheitert daran.

Gibt es eine Möglichkeit, meine PNG NSData zu verwenden, um ein CGImage zu erstellen, das nicht beschädigt ist? Bitte helfen.

THanks

Antwort

3

Die erste ist sehr falsch. Sie können eine NSData -Instanz nicht einfach in eine CGImageRef umwandeln.

Die zweite sollte gut funktionieren. Sie müssen die NSData-Instanz in eine CFDataRef-Instanz umwandeln, aber das ist vollkommen legal aufgrund dessen, was Apple gebührenfreie Überbrückung nennt.

Hier ist eine andere und viel einfachere Methode:

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

Ich ziehe die höhere Ebene UIImage Methoden zu verwenden, um Bilder zu laden und image.CGImage dann für niedrigere Level-Funktionen Core Graphics zu verwenden. Vergessen Sie nicht, das UIImage richtig zu behalten, wenn Sie es herum behalten müssen.

+0

'image.CGImage' ist auf jeden Fall besser als' (CGImageRef) [(id) CGImageCreateWithPNGDataProvider ((CGDataProviderRef) [(id) CGDataProviderCreateWithNSData ((CFDataRef) UIImagePNGRepresentation (Bild)) Autofreigabe ], 0,0,0) Autorelease] ' –

+1

Beachten Sie, dass UIKit nicht threadsicher ist, daher kann das Erstellen von 'UIImage'-Instanzen in Hintergrundthreads zu Problemen führen. In manchen Fällen ist es besser, direkt einen 'CGImageRef' zu erstellen. – cheeesus

+0

@cheeesus, nach Apples Dokumentation (https://developer.apple.com/reference/uikit/uiimage) ist es sicher, UIImage-Instanzen in Hintergrundthreads zu erstellen: * "Die unveränderliche Natur von Bildobjekten bedeutet auch, dass sie es sind Sicheres Erstellen und Verwenden von beliebigen Threads. "* – Arda

9

Ihr zweiter Versuch ist fast richtig. CFData und NSData sind "gebührenfrei überbrückt". Alles, was eine CFDataRef akzeptiert, akzeptiert auch NSData (und umgekehrt) - Sie müssen nur richtig casten.

Sie benötigen:

CGDataProviderCreateWithCFData((CFDataRef)myNSData); 
+2

Wenn Sie über ARC verfügen, verwenden Sie __bridge, um direkt zu konvertieren: CGDataProviderCreateWithCFData ((__ bridge CFDataRef) myNSData); – situee

Verwandte Themen