CoreGraphics: использование штрихов пальца для удаления части изображения?

#iphone #objective-c #image #drawing #core-graphics

#iPhone #objective-c #изображение #рисование #ядро-графика

Вопрос:

Я работаю над рисованием кода для удаления части изображения. Я не эксперт в области 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

Ответ №1:

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

Вместо этого выполните CGContextSetBlendMode(context, kCGBlendModeClear)

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

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

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

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

Ответ №2:

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

Комментарии:

1. Можете ли вы объяснить, что вы подразумеваете под рендерингом в отдельный поток?

2. Прежде всего, не используйте UIGraphicsGetCurrentContext. Сохраняйте свой собственный CGContextRef в фоновом режиме, на котором вы рисуете. Ваши события обработчика касания должны отображаться / стираться в этом CGContextRef. Единственное, что должен делать ваш код drawRect, это выводить этот CGContextRef на экран. Пока не беспокойтесь о потоках … выполнение именно этого действительно поможет. Если вам интересно, ознакомьтесь с моим приложением для рисования Artist’s Touch.