在Quartz中绘制单个像素

时间:2010-05-07 10:55:47

标签: iphone quartz-graphics

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

1)如何在Quartz中为单个像素着色?我一直想着制作1比1的矩形。

2)是否有更好,更有效的方法来实现这种效果?

2 个答案:

答案 0 :(得分: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);

大多数代码都很清楚,但这里有一些要点:

    如果两者具有相同的alpha且alpha不是1.0,则
  • kCGBlendMode基本上会添加back和foreground的值。您也可以使用kCGBlendModeColorBurn而无需使用透明度。检查参考。
  • radius足以涵盖整个框架。您可以设置不同的值。
  • 请注意,locations值应介于0.0和1.0之间。您需要根据radius
  • 校准颜色值

答案 1 :(得分:0)

之前有人问过:

从Quartz开始,1x1矩形会做你想要的。但它肯定不是很有效率。

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