2010-05-07 40 views
1

我有一个CGPoint数组,我想用颜色填充整个屏幕,每个像素的颜色取决于到数组中每个点的总距离。要做到这一点的自然方法是,为每个像素计算总距离,并将其转换为颜色。问题如下:在Quartz中绘制单个像素

1)如何在Quartz中为单个像素着色?我一直在考虑制作1×1矩形。

2)有没有更好,更有效的方法来达到这种效果?

回答

4

您不需要逐像素地绘制它。您可以使用径向渐变:

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); 

大部分的代码是明确的,但这里有一些要点:

  • kCGBlendMode基本上是增加的后台和前台的值,如果两者都具有相同的α和阿尔法不是1.0。你也可以使用kCGBlendModeColorBurn而不需要玩透明。检查参考。
  • radius足够大以覆盖整个框架。您可以设置不同的值。
  • 请注意locations值应该在0.0到1.0之间。您需要根据radius来校准颜色值。
0

这已经被问过:

石英,1x1的矩形会做你想要什么。但它当然不是非常有效。

你最好创建一个内存缓冲区,计算你的点距离,并在处理循环中直接写入数组。然后为了显示结果,只需创建一个CGImage,然后可以将其渲染到屏幕上下文中。