2010-08-21 36 views
5

Je reçois des erreurs EXEC_BAD_ACCESS dans un appel CGContextDrawImage et j'essaie de le retracer. J'ai une image PNG et exécute une UIImagePNGRepresentation o elle me donne une instance NSData.Comment convertir NSData en CGDataProviderRef sur iphone sdk?

J'ai besoin de convertir ceci en instance CGImageRef, donc je peux exécuter la méthode CGImageCreateWithPNGDataProvider avec ce CGImageRef. J'ai essayé de deux façons: 1) Pour le lancer.

CGImageRef ref = (CGDataProvider) nsdata;

2) Pour exécuter CGDataProviderCreateWithCFData (nsdata);

Le premier cas renvoie l'image vide, bien que la commande n'échoue pas. La raison pour laquelle j'ai essayé le second cas, même si j'ai NSData et pas CFData, c'est parce que je me souviens avoir lu les deux cas. Quelle que soit la raison, elle échoue à cause de cela.

Y at-il un moyen que je peux utiliser mon PNG NSData pour créer un CGImage qui n'est pas corrompu? S'il vous plaît aider.

THanks

Répondre

3

Le premier est très faux. Vous ne pouvez pas transformer une instance NSData en CGImageRef simplement en la castant.

La seconde devrait fonctionner correctement. Vous devrez lancer l'instance NSData à un CFDataRef mais cela est parfaitement légal en raison de ce que Apple appelle sans frais pont.

Voici une autre méthode et beaucoup plus facile:

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

Je préfère utiliser le niveau UIImage des méthodes plus pour charger des images, puis utiliser image.CGImage pour bas niveau de base des fonctions graphiques. Ne pas oublier de conserver correctement le UIImage si vous avez besoin de le garder.

+0

'image.CGImage' est certainement mieux que' (CGImageRef) [(id) CGImageCreateWithPNGDataProvider ((CGDataProviderRef) [(id) CGDataProviderCreateWithNSData ((CFDataRef) UIImagePNGRepresentation (image)) autorelease ], 0,0,0) autorelease] ' –

+1

Notez que UIKit n'est pas sûr pour les threads, donc créer des instances' UIImage' sur les threads d'arrière-plan peut entraîner des problèmes. Dans certains cas, il est préférable de créer directement un 'CGImageRef'. – cheeesus

+0

@cheeesus, selon la documentation d'Apple (https://developer.apple.com/reference/uikit/uiimage), il est sécuritaire de créer des instances UIImage dans les threads d'arrière-plan: * "La nature immuable des objets image signifie aussi qu'ils sont » – Arda

9

Votre deuxième essai est presque juste. CFData et NSData sont «sans frais pontés». Tout ce qui accepte un CFDataRef accepte également NSData (et vice-versa) - il vous suffit de lancer correctement.

Vous devez:

CGDataProviderCreateWithCFData((CFDataRef)myNSData); 
+2

Si vous avez ARC, utilisez __bridge pour convertir directement: CGDataProviderCreateWithCFData ((__ bridge CFDataRef) myNSData); – situee