2009-08-17 6 views
2

Finalement, je travaille sur une fonction de boîte de flou pour une utilisation sur iPhone. Cette fonction prend un UIImage et dessine des copies transparentes, d'abord sur les côtés, puis prend cette image et dessine des copies transparentes au-dessus et en dessous, renvoyant une image bien floue. En lisant le code Drawing with Quartz 2D Programming Guide, il est recommandé d'utiliser CGLayers pour ce type d'opération.Comment utiliser un CGLayer pour dessiner plusieurs images hors écran

Le code exemple dans le guide est un peu dense pour moi de comprendre, donc je voudrais que quelqu'un me montre un exemple très simple de prendre un UIImage et la convertir en un CGLayer que je puis tirer copies et retour sous la forme UIImage.

Ce serait bien si les valeurs étaient codées en dur (pour plus de simplicité). C'est juste pour moi d'envelopper ma tête, pas pour le code de production.

+0

@Joe - Si vous avez quelque chose à répondre, s'il vous plaît faire. Le but de ce site n'est pas de gagner des points arbitraires, mais d'aider les autres. Le score est simplement un renforcement pour un comportement positif. Juste parce que quelqu'un ne vote pas sur votre réponse ne signifie pas que vous avez perdu du temps à l'écrire. À tout le moins, vous pourriez avoir appris quelque chose dans le processus de répondre à la question. –

+0

@Joe Si vous voulez aider, aidez. – willc2

Répondre

2
UIImage *myImage = …; 
CGLayerRef layer = CGLayerCreateWithContext(destinationContext, myImage.size, /*auxiliaryInfo*/ NULL); 
if (layer) { 
    CGContextRef layerContext = CGLayerGetContext(layer); 
    CGContextDrawImage(layerContext, (CGRect){ CGPointZero, myImage.size }, myImage.CGImage); 

    //Use CGContextDrawLayerAtPoint or CGContextDrawLayerInRect as many times as necessary. Whichever function you choose, be sure to pass destinationContext to it—you can't draw the layer into itself! 

    CFRelease(layer); 
} 

C'est techniquement mon tout premier code iPhone (je ne fais que programmer sur le Mac), alors méfiez-vous. J'ai utilisé CGLayer auparavant, cependant, et pour autant que je sache, Quartz n'est pas différent sur l'iPhone.

... et de retourner en UIImage.

Je ne suis pas sûr de savoir comment faire cette partie, n'ayant jamais travaillé avec UIKit.

+0

D'où provient destinationContext? Est-ce que je viens de déclarer un nouveau comme ceci: CGContextRef destinationContext; – willc2

+0

Le contexte de destination est celui dans lequel vous allez dessiner le calque. En supposant que vous ne créez pas vous-même le contexte de destination, vous l'obtiendrez de la pile de contexte en appelant 'UIGraphicsGetCurrentContext'. –

+0

Bien sûr, si vous envisagez de faire un UIImage au lieu de dessiner dans une vue, vous allez probablement créer le contexte vous-même. Vous créez un contexte bitmap, dessinez dedans, puis utilisez son buffer pour créer un CGImage avec lequel créer un UIImage. (Il peut y avoir un moyen plus simple de faire cela.) –

Questions connexes