2010-08-06 8 views
0

J'essaie de créer CGImage à partir de NSTextField.
J'ai eu du succès avec ça. Cependant, je ne peux pas obtenir CGImage qui consiste en seulement du texte. Je veux dire que, chaque fois que la capture de l'textfield Je reçois la couleur de la fenêtre de fond avec elle. (On dirait que je ne reçois pas d'info de canal alpha)Récupération de CGImage à partir de NSView

J'ai essayé suivant extrait de http://www.cocoadev.com/index.pl?ConvertNSImageToCGImage


NSBitmapImageRep * bm = [NSBitmapImageRep alloc]; 
[theView lockFocus]; 
[bitmap initWithFocusedViewRect:[theView bounds]]; 
[theView unlockFocus] 

[bma retain];// data provider will release this 
int  rowBytes, width, height; 

rowBytes = [bm bytesPerRow]; 
width = [bm pixelsWide]; 
height = [bm pixelsHigh]; 

CGDataProviderRef provider = CGDataProviderCreateWithData(bm, [bm bitmapData], rowBytes * height, BitmapReleaseCallback); 
CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 
CGBitmapInfo bitsInfo = kCGImageAlphaPremultipliedLast; 

CGImageRef img = CGImageCreate(width, height, 8, 32, rowBytes, colorspace, bitsInfo, provider, NULL, NO, kCGRenderingIntentDefault); 

CGDataProviderRelease(provider); 
CGColorSpaceRelease(colorspace); 

return img; 


Toute aide pour obtenir CGImage sans couleur de fond?

Répondre

1

-initWithFocusedViewRect: lit à partir du magasin de sauvegarde de la fenêtre, donc essentiellement c'est une capture d'écran de cette partie de la fenêtre. C'est pourquoi vous obtenez la couleur d'arrière-plan de la fenêtre dans votre image.

-[NSView cacheDisplayInRect:toBitmapImageRep:] est très similaire, mais il entraîne la vue et ses sous-vues, mais pas ses superviews, à se redessiner. Si votre champ de texte est sans bordure, cela peut suffire pour vous. (Assurez-vous d'utiliser -bitmapImageRepForCachingDisplayInRect: pour créer votre NSBitmapImageRep!)

Il existe une autre option qui pourrait être considérée comme étant encore plus correcte que ce qui précède. NSTextField dessine son contenu en utilisant son NSTextFieldCell. Rien ne vous empêche vraiment de créer une image avec la taille appropriée, de la verrouiller, puis d'appeler le -drawInteriorWithFrame:inView:. Cela devrait juste dessiner le texte, exactement comme il a été dessiné dans le champ de texte.

Enfin, si vous voulez simplement dessiner du texte, n'oubliez pas NSStringDrawing. NSString a des méthodes qui dessineront avec des attributs (drawAtPoint:withAttributes:), et NSAttributedString a également des méthodes de dessin (drawAtPoint:). Vous pouvez en utiliser un au lieu de demander à NSTextFieldCell de dessiner pour vous.

+0

En fait, je vais générer des textures à partir de CGImage. En tout cas merci pour votre soln, je serai bientôt de retour. – shakthi

+0

C'est bien. Toutes les méthodes ci-dessus produisent un NSImage ou NSBitmapImageRep dont vous pouvez créer un CGImage. – kperryua

+0

Cela fonctionne très bien, merci. – shakthi

Questions connexes