【发布时间】:2010-05-07 10:55:47
【问题描述】:
我有一个 CGPoints 数组,我想用颜色填充整个屏幕,每个像素的颜色取决于到数组中每个点的总距离。这样做的自然方法是,对于每个像素,计算总距离,并将其转换为颜色。问题如下:
1) 如何在 Quartz 中为单个像素着色?我一直在考虑制作 1 x 1 的矩形。
2) 有没有更好、更有效的方法来达到这种效果?
【问题讨论】:
我有一个 CGPoints 数组,我想用颜色填充整个屏幕,每个像素的颜色取决于到数组中每个点的总距离。这样做的自然方法是,对于每个像素,计算总距离,并将其转换为颜色。问题如下:
1) 如何在 Quartz 中为单个像素着色?我一直在考虑制作 1 x 1 的矩形。
2) 有没有更好、更有效的方法来达到这种效果?
【问题讨论】:
您不需要逐个像素地绘制它。您可以使用径向渐变:
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 如果两者具有相同的 alpha 且 alpha 不是 1.0,则基本上会添加背景和前景的值。您也可以使用kCGBlendModeColorBurn 而无需使用透明度。检查参考。radius 足够大,可以覆盖整个框架。您可以设置不同的值。locations 值应介于 0.0 和 1.0 之间。您需要根据radius 校准您的颜色值。【讨论】:
以前有人问过这个问题:
在 Quartz 中,一个 1x1 的矩形可以满足您的需求。但这肯定不是很有效。
你最好创建一个内存缓冲区,计算你的点距离,然后直接在你的处理循环中写入数组。然后要显示结果,只需创建一个 CGImage 即可将其渲染到屏幕上下文中。
【讨论】: