2010-05-07 4 views
1

J'ai un tableau de CGPoints, et je voudrais remplir tout l'écran avec des couleurs, la couleur de chaque pixel en fonction de la distance totale à chacun des points dans le tableau. La façon naturelle de procéder est de calculer la distance totale pour chaque pixel et de la transformer en couleur. Les questions sont les suivantes:Dessiner un seul pixel dans le quartz

1) Comment puis-je colorer un seul pixel dans Quartz? J'ai pensé à faire des rectangles 1 par 1.

2) Y a-t-il des façons meilleures et plus efficaces d'obtenir cet effet?

Répondre

4

Vous n'avez pas besoin de dessiner pixel par pixel. Vous pouvez utiliser des dégradés radiaux:

CGPoint points[count]; 
/* set the points */ 

CGContextSaveGState(context); 
CGContextBeginTransparencyLayer(context, NULL); 

CGContextSetAlpha(context, 0.5); 
CGContextSetBlendMode(context, kCGBlendModeXOR); 
CGContextClipToRect(context, myFrame); 
CGFloat radius = myFrame.size.height+myFrame.size.width; 

CGColorSpaceRef colorSpace; 
CFArrayRef colors; 
const CGFloat * locations; 
/* create the colors for the gradient */ 

for(NSUInteger i = 0;i<count;i++){ 
    CGGradientRef gradient = CGGradientCreateWithColors(CGColorSpaceCreateDeviceGray(), colors, locations); 
    CGContextDrawRadialGradient(context, gradient, points[i], 0.0, points[i], radius, 0); 
} 

CGContextSetAlpha(context, 1.0); 
CGContextEndTransparencyLayer(context); 
CGContextRestoreGState(context); 

La plupart du code est clair, mais voici quelques points:

  • kCGBlendMode ajoute essentiellement la valeur de premier plan et si back- les deux ont la même alpha et alpha n'est pas 1.0. Vous pourriez également être en mesure d'utiliser kCGBlendModeColorBurn sans avoir besoin de jouer avec la transparence. Vérifiez la référence.
  • radius est assez grand pour couvrir toute la trame. Vous pouvez définir une valeur différente. Notez que les valeurs locations doivent être comprises entre 0,0 et 1,0. Vous devez calibrer vos valeurs de couleur en fonction du radius.
0

Cela a été posée:

à partir de quartz, un rectangle de 1x1 ferait ce que vous voulez. Mais ce n'est certainement pas très efficace.

Il est préférable de créer un tampon mémoire, de calculer vos distances de points et d'écrire directement dans la matrice de votre boucle de traitement. Ensuite, pour afficher le résultat, créez simplement une CGImage que vous pouvez ensuite afficher dans votre contexte d'écran.

Questions connexes