2016-01-22 3 views
3

Я пытаюсь покрасить изображение, используя Objective C в iOS. enter image description hereЦвет сложного изображения в iOS

Я хочу покрасить изображение по высоте. Например, первые 10 пикселей с красным, следующие 20 с синим и следующие 20 с зеленым. Я хочу, чтобы изображение было покрашено таким образом.

enter image description here

Я искал переполнение стека, но я не могу найти способ сделать это.

Благодаря

Edit:

Это, как я нарисовал образ

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextMoveToPoint(context, 0, 300); 
CGContextAddLineToPoint(context, 20, 230); 
CGContextAddLineToPoint(context, 80, 230); 
CGContextAddLineToPoint(context, 120, 150); 
CGContextAddLineToPoint(context, 140, 230); 
CGContextAddLineToPoint(context, 300, 300); 
CGContextClosePath(context); 


CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); 
CGContextStrokePath(context); 

Это график местности. Точки на графике будут динамическими. Поэтому, основываясь на высоте местности, она должна быть окрашена. Поэтому я не смогу создавать отдельные пути для отдельных цветов, так как я получаю только высоты. У меня нет информации о точках для отдельных цветовых путей на графике.

+1

Цвет изображения? Как определяется ваш образ при запуске? Любой BezierPath/CGPath? Вы знаете делимитации? – Larme

+0

u нужен отдельный bezierpath для каждого сегмента цвета u, который хотите заполнить. –

+0

do u хотите заполнить весь сегмент за один раз/заполнить его на основе касания так же, как рисование? –

ответ

4

Как вы уже сказали, одним из способов является просто обработать вашу фигуру в виде маски . Маска означает, что ваша форма графа пробивает «отверстие» на изображении. Полосами цвета могут быть просто трехцветные прямоугольные виды позади изображение, легко созданное в коде. Три прямоугольных вида за изображением видны через отверстие.

В качестве альтернативы, нарисуйте форму графика, затем обработайте форму графика как обводной путь и нарисуйте три цветных прямоугольника.

Используя второй подход, я легко смог получить этот результат:

enter image description here

Вот код, который я использовал:

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(context, 3); 

// your code: 
CGContextMoveToPoint(context, 0, 300); 
CGContextAddLineToPoint(context, 20, 230); 
CGContextAddLineToPoint(context, 80, 230); 
CGContextAddLineToPoint(context, 120, 150); 
CGContextAddLineToPoint(context, 140, 230); 
CGContextAddLineToPoint(context, 300, 300); 
CGContextClosePath(context); 

CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); 
CGContextStrokePath(context); 

// my code starts here - first, draw path again: 

CGContextMoveToPoint(context, 0, 300); 
CGContextAddLineToPoint(context, 20, 230); 
CGContextAddLineToPoint(context, 80, 230); 
CGContextAddLineToPoint(context, 120, 150); 
CGContextAddLineToPoint(context, 140, 230); 
CGContextAddLineToPoint(context, 300, 300); 
CGContextClosePath(context); 

// clip to that path, and draw the rectangles: 
CGContextClip(context); 
CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor); 
CGContextFillRect(context, CGRectMake(0,250,300,50)); 
CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor); 
CGContextFillRect(context, CGRectMake(0,200,300,50)); 
CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); 
CGContextFillRect(context, CGRectMake(0,150,300,50)); 
+0

Для подобного примера см. Мой ответ здесь: http://stackoverflow.com/a/23202718/341994 – matt

0

Это код первого метода, упомянутой @matt

UIBezierPath *maskPath = [UIBezierPath bezierPath]; 
[maskPath moveToPoint:CGPointMake(0, 300)]; 
[maskPath addLineToPoint:CGPointMake(20, 230)]; 
[maskPath addLineToPoint:CGPointMake(80, 230)]; 
[maskPath addLineToPoint:CGPointMake(120, 150)]; 
[maskPath addLineToPoint:CGPointMake(140, 230)]; 
[maskPath addLineToPoint:CGPointMake(300, 300)]; 
[maskPath addLineToPoint:CGPointMake(300, 0)]; 
[maskPath addLineToPoint:CGPointMake(0, 0)]; 
[maskPath closePath]; 
CAShapeLayer *mask = [CAShapeLayer layer]; 
mask.path = maskPath.CGPath; 
self.maskView.layer.mask = mask; 
+1

Но вы не показываете, как получить цветные полосы. – matt

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