2010-05-07 2 views
1

У меня есть массив CGPoints, и я хотел бы заполнить весь экран цветами, цветом каждого пикселя в зависимости от общего расстояния до каждой из точек в массиве. Естественный способ сделать это - для каждого пикселя вычислить общее расстояние и превратить это в цвет. Вопросы следуют:Рисование одиночного пикселя в 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, который затем можно преобразовать в контекст экрана.

Смежные вопросы