CoreGraphics: Использование ударов пальцем, чтобы стереть часть изображения? - PullRequest
3 голосов
/ 27 апреля 2011

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

Эта процедура работает нормально, однако при быстром движении она теряет прикосновения (не очень плавно). Можно ли изменить эту процедуру, чтобы сделать CGContextClearRect более плавным? Есть ли лучший, более быстрый способ сделать это?

-(void)drawRect:(CGRect)rect {

    if (!myDrawing) { // touchpoints stored here
        myDrawing = [[NSMutableArray alloc] initWithCapacity:0];
    }
    UIGraphicsBeginImageContext(frontImage.frame.size);
    [frontImage.image drawInRect:CGRectMake(0, 0, frontImage.frame.size.width, frontImage.frame.size.height)];

    if ([myDrawing count] > 0) {
        CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5);
        CGContextSetLineCap(UIGraphicsGetCurrentContext(),kCGImageAlphaNone );
        CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1, 0, 0, 10);

        for (int i = 0 ; i < [myDrawing count] ; i++) {
            NSArray *thisArray = [myDrawing objectAtIndex:i];

            if ([thisArray count] > 2) {
                float thisX = [[thisArray objectAtIndex:0] floatValue];
                float thisY = [[thisArray objectAtIndex:1] floatValue];
                CGContextBeginPath(UIGraphicsGetCurrentContext());

                for (int j = 2; j < [thisArray count] ; j+=2) {
                    thisX = [[thisArray objectAtIndex:j] floatValue];
                    thisY = [[thisArray objectAtIndex:j+1] floatValue];

                CGContextClearRect (UIGraphicsGetCurrentContext(), CGRectMake(thisX, thisY, 10, 10));
                }
            }
        }

    }
    frontImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

}
Симулятор iOS

Ответы [ 2 ]

8 голосов
/ 26 октября 2011

Вам не нужно использовать CGContextClearRect для удаления штрихов.

Вместо этого CGContextSetBlendMode(context, kCGBlendModeClear)

Этот вызов изменяет режим смешивания цветов таким образом, чтобы операции рисования очищали растровое изображение вместо рисования с помощью цвета.

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

Чтобы вернуться к обычному рендерингу, выполните CGContextSetBlendMode(context, kCGBlendModeNormal)

Использование различных режимов наложения может быть очень полезным.

0 голосов
/ 27 апреля 2011

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

...