2010-05-07 87 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,然後可以將其渲染到屏幕上下文中。