2010-04-29 2 views
2

J'essaye de prendre un CGImage et de copier ses données dans un tampon pour le traitement ultérieur. Le code ci-dessous est ce que j'ai jusqu'ici, mais il y a une chose que je n'aime pas à ce sujet - c'est de copier deux fois les données de l'image. Une fois pour CGDataProviderCopyData() et une fois pour l'appel :getBytes:length sur imgData. Je n'ai pas été en mesure de trouver un moyen de copier les données d'image directement dans mon tampon et couper l'étape CGDataProviderCopyData(), mais il doit y avoir un moyen ... des pointeurs? (... jeu de mots FTW)iPhone - Obtenez un pointeur vers les données derrière CGDataProvider?

 
NSData *imgData = (NSData *)(CGDataProviderCopyData(CGImageGetDataProvider(myCGImageRef))); 

CGImageRelease(myCGImageRef); 

// i've got a previously-defined pointer to an available buffer called "mybuff" 
[imgData getBytes:mybuff length:[imgData length]]; 
+0

Je suis désolé pour le jeu de mots. Je me sens terrible maintenant. – jtrim

+1

Voilà: http://xkcd.com/138/ :-) –

Répondre

0

Sauf si vous voyez un problème de performances lorsque vous utilisez des instruments pour mesurer, je ne pense pas que la copie est deux fois un énorme problème. Vous pouvez toujours stocker le CFDataRef imgData directement à la place du mybuff.

Modifier
Je parle de ce genre de code:
Dans votre interface de classe ajouter un tableau:

NSMutableArray *images; 

Dans init: Méthode: créer le tableau:

images = [[NSMutableArray alloc] init]; 

et avoir un dealloc;

-(void)dealloc{ 
    [images release]; 
} 

et dans votre code qui enregistre chaque image:

CGDataRef imageDataRef = CGDataProviderCopyData(CGImageGetDataProvider(myCGImageRef))); 
[images addObject: (NSData*)imageDataRef]; 
CGRelease(imageDataRef); 
+0

Le problème est que ce code s'exécute rapidement: je suis en train d'effectuer un screengrabbing, puis de remplir le tampon avec les données d'image aussi vite que possible. En ce moment, le meilleur que je peux faire sur l'iPhone 3G est de 11,5 FPS, mais je pense qu'il peut faire mieux. Si je le faisais une fois puis passer à autre chose, je dirais que vous avez raison d'affirmer que ce n'est pas un gros coup de performance ... mais dans cette situation, je peux bénéficier de tous les intermédiaires que je peux découper. Pourriez-vous élaborer sur votre déclaration "Vous pouvez toujours stocker le CFDataRef imgData directement ..."? – jtrim

+0

Renvoyer l'objet NSData et utiliser sa méthode -bytes pour accéder aux octets de l'image au lieu d'utiliser votre tampon est ce que voulait dire lucius. Un autre point: simplement parce que vous utilisez toutes ces méthodes avec le mot "copier" ne veut pas dire que les données réelles des octets sont physiquement copiées. Si tous les objets sont immuables. IL est possible qu'ils utilisent tous le même tampon d'octets. – JeremyP

+0

JeremyP - Il me semble que Apple est toujours délibérément littéral dans leur documentation. J'ai trouvé que s'ils utilisent le mot «copie», vous obtenez une copie. – jtrim

Questions connexes