Как рисовать линии с альфа <1 в кварце 2d - PullRequest
2 голосов
/ 23 февраля 2012

Нет сомнений, что это может быть повторяющийся вопрос, но я не могу найти правильное решение из любого сообщения здесь. Так что я публикую это как новый пост с надеждой, что у меня будет какое-то решение.

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

В некоторых случаях я обнаружил, что рисование в двух видах решает эту проблему, но я не смог понять логику этого.

enter image description here

Я использую обычный кварцевый 2D-код для рисования линий на сенсорных событиях.

Ответы [ 4 ]

3 голосов
/ 23 февраля 2012

Дубликат На рисунке CoreGraphics, как я могу сохранить точку перекрытия темнее, чем остальная часть линии?

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

Вот один из способов сделать это: создать 2 вида: один для фона, другой для линий.Нарисуйте линии на виде сверху с альфа 1!Затем установите альфа всего этого вида переднего плана на 0,5 (или любое другое значение, которое вы хотите использовать).

[topView setAlpha:0.5];

Это предотвратит усиление полупрозрачного мазка кисти.Но как насчет двух разных мазков, которые пересекают друг друга (как в вашем примере).Вы хотите, чтобы это пересечение было более интенсивным?Если это так, то вам нужно создать новый вид для каждого мазка кисти.Чтобы предотвратить переполнение памяти из-за слишком большого количества представлений, вам нужно смешать предыдущие виды сверху с фоном.

1 голос
/ 28 февраля 2012

Hie ..

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

Нет сомнений, что это трюк, который работает, так как я рисую на каждом прикосновении, и это работает ..

- (void)drawRect:(CGRect)rect {
for (int j=0; j<[pathArray count]; j++) 
{
    context = UIGraphicsGetCurrentContext();
    NSMutableDictionary *tmp=[pathArray objectAtIndex:j];
    NSMutableArray *currentPath=[tmp objectForKey:@"path"];
    for (int i=0; i<[currentPath count]; i++) 
    {
        CGPoint mid1 = [[self midPoint:[currentPath objectAtIndex:i+1]  :[currentPath objectAtIndex:i]] CGPointValue]; 
        CGPoint mid2 = [[self midPoint:[currentPath objectAtIndex:i+2] :[currentPath objectAtIndex:i+1]] CGPointValue];
        CGContextMoveToPoint(context, mid1.x, mid1.y);
        CGContextAddQuadCurveToPoint(context, [[currentPath objectAtIndex:i+1] CGPointValue].x, [[currentPath objectAtIndex:i+1] CGPointValue].y, mid2.x, mid2.y); 
        CGContextSetShadow(context, CGSizeMake(-2, -2), 3);
        CGContextSetAlpha(context, [[tmp objectForKey: @"opacity"] floatValue]);    
        CGContextSetLineCap(context, kCGLineCapRound);
        CGContextSetStrokeColorWithColor(context,[[tmp objectForKey: @"Color"] CGColor]);               
        CGContextSetLineWidth(context, [[tmp objectForKey: @"width"] floatValue]);              
        i+=2;
    }   
    CGContextStrokePath(context);

}
}
0 голосов
/ 23 февраля 2012
#pragma mark -
#pragma mark Touch Event

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];

    lastPoint = [touch locationInView:drawView];
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];   
    CGPoint currentPoint = [touch locationInView:drawView];

    UIGraphicsBeginImageContext(drawView.frame.size);

    [drawImage.image drawInRect:CGRectMake(0, 0, drawView.frame.size.width, drawView.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 1.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0);
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    lastPoint = currentPoint;

}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    UIGraphicsBeginImageContext(drawView.frame.size);
    [drawImage.image drawInRect:CGRectMake(0, 0, drawView.frame.size.width, drawView.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 1.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0);
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    CGContextFlush(UIGraphicsGetCurrentContext());
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}
0 голосов
/ 23 февраля 2012

Похоже, вы рисуете круг в каждой точке серии сенсорных событий.Вместо этого вы можете создать Path с CoreGraphics/Quartz2D, установить ширину линии равной любой толщине, а затем обвести этот путь по мере необходимости, чтобы интерфейс выглядел хорошо.Я давно этого не делал, но думаю, что большая часть того, что вам нужно, будет в CoreGraphics/CGContext.h и ~/CGPath.h, etc. См. Мой ответ на другую проблему CoreGraphics здесь .

Единственное, что мне сейчас не известно, это то, можете ли вы вставить CGMutablePathRef в контекст, прежде чем «закрыть» его, используя CGPathCloseSubpath().Вам придется экспериментировать.Во всяком случае, когда вы получаете события мыши, вы будете строить путь с новыми точками и визуализировать его постепенно.Дайте мне знать, если вам нужны пояснения.

PS, как для opacity, вы установите , когда создадите CGColorRef для своего контекста ... многие вызовы в CoreGraphics/CGColor.h имеет альфа-параметр.

...