我有一個CGPoint數組,我想用顏色填充整個屏幕,每個像素的顏色取決於到數組中每個點的總距離。要做到這一點的自然方法是,爲每個像素計算總距離,並將其轉換爲顏色。問題如下:在Quartz中繪製單個像素
1)如何在Quartz中爲單個像素着色?我一直在考慮製作1×1矩形。
2)有沒有更好,更有效的方法來達到這種效果?
我有一個CGPoint數組,我想用顏色填充整個屏幕,每個像素的顏色取決於到數組中每個點的總距離。要做到這一點的自然方法是,爲每個像素計算總距離,並將其轉換爲顏色。問題如下:在Quartz中繪製單個像素
1)如何在Quartz中爲單個像素着色?我一直在考慮製作1×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
基本上是增加的後臺和前臺的值,如果兩者都具有相同的α和阿爾法不是1.0。你也可以使用kCGBlendModeColorBurn
而不需要玩透明。檢查參考。radius
足夠大以覆蓋整個框架。您可以設置不同的值。locations
值應該在0.0到1.0之間。您需要根據radius
來校準顏色值。這已經被問過:
石英,1x1的矩形會做你想要什麼。但它當然不是非常有效。
你最好創建一個內存緩衝區,計算你的點距離,並在處理循環中直接寫入數組。然後爲了顯示結果,只需創建一個CGImage,然後可以將其渲染到屏幕上下文中。