Как потянуть прозрачный штрих (или так или иначе ясная часть изображения) на iPhone

Вы забыли инициализировать buffer. И вам лучше завершить свою строку управления форматом printf (3) с помощью \n или иначе вызвать fflush (3) перед любым вводом (начиная с stdio (3) [ 117] буферизируется).

Неинициализированный указатель содержит мусор. Его использование - неопределенное поведение . Будьте напуганы !

Так что я предлагаю кодировать

size_t bufsiz = 64;
char *buffer = malloc(bufsiz);
if (!buffer) { perror("malloc buffer"); exit(EXIT_FAILURE); };

и позже

printf("Salut ! Quel est ton nom ?\n");
characters = getline(&buffer,&bufsize,stdin);

В следующий раз включите все предупреждения и информацию отладки, когда компилируя, поэтому скомпилируйте ваш код с помощью gcc -Wall -Wextra -g, если используете GCC . Вы бы получили несколько предупреждений.

Конечно, прочитайте Как отлаживать небольшие программы и отладка с помощью GDB

В Linux, в В вашем конкретном случае вас может заинтересовать использование readline (3) вместо getline (3) .

Не забудьте прочитать документацию по каждой функции, которую вы используете (например, здесь , если она стандартная C).

19
задан Vadim Kotov 15 September 2017 в 15:20
поделиться

4 ответа

Это поможет:

CGContextSetBlendMode(context, kCGBlendModeClear)
58
ответ дан 30 November 2019 в 02:39
поделиться

Я попытался использовать:

CGContextSetStrokeColorWithColor (myContext, [[UIColor clearColor] CGColor]);

но это не работает, потому что это, кажется, "тянет" сверху контекста с невидимым цветом (и невидимый цвет + безотносительно цвета, который это привлекает = цвет, который это привлекает).

Единственное решение, которое я нашел (который не оптимален):

CGContextClearRect (myContext, CGRectMake(x, y, width, height));

К сожалению, это означает, что необходимо проследить серию, реагирует, и генерируйте строку сами...

1
ответ дан 30 November 2019 в 02:39
поделиться

Я закончил тем, что использовал алгоритм строки Bresenham (слушающий назад дни былого, когда я должен был записать свои собственные графические стандартные программы)...

- (void) contextEraseLine:(CGContextRef) ctx from:(CGPoint)startPoint to:(CGPoint) endPoint withThickness:(int)thickness {
    int x, cx, deltax, xstep,
    y, cy, deltay, ystep,
    error, st, dupe;

    int x0, y0, x1, y1;

    x0 = startPoint.x;
    y0 = startPoint.y;
    x1 = endPoint.x;
    y1 = endPoint.y;

    // find largest delta for pixel steps
    st = (abs(y1 - y0) > abs(x1 - x0));

    // if deltay > deltax then swap x,y
    if (st) {
        (x0 ^= y0); (y0 ^= x0); (x0 ^= y0); // swap(x0, y0);
        (x1 ^= y1); (y1 ^= x1); (x1 ^= y1); // swap(x1, y1);
    }

    deltax = abs(x1 - x0);
    deltay = abs(y1 - y0);
    error  = (deltax / 2);
    y = y0;

    if (x0 > x1) { xstep = -1; }
    else         { xstep =  1; }

    if (y0 > y1) { ystep = -1; }
    else         { ystep =  1; }

    for ((x = x0); (x != (x1 + xstep)); (x += xstep))
    {
        (cx = x); (cy = y); // copy of x, copy of y

        // if x,y swapped above, swap them back now
        if (st) { (cx ^= cy); (cy ^= cx); (cx ^= cy); }

        (dupe = 0); // initialize no dupe

        if(!dupe) { // if not a dupe, write it out
            //NSLog(@"(%2d, %2d)", cx, cy);

            CGContextClearRect(ctx, CGRectMake(cx, cy, thickness, thickness));

    }

        (error -= deltay); // converge toward end of line

        if (error < 0) { // not done yet
            (y += ystep);
            (error += deltax);
        }
    }
}

Уф! Это - длинный путь для движения для создания (несколько) неуклюжей строки средства стирания.

Для использования его сделайте что-то как:

- (void)eraseStart {
    // erase lines
    UIGraphicsBeginImageContext(drawingBoard.size);
    ctx = UIGraphicsGetCurrentContext();
    CGContextDrawImage(ctx,CGRectMake(0,0,drawingBoard.size.width, drawingBoard.size.height),[drawingBoard CGImage]); 
}

- (void)eraseEnd {
    drawingBoard = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [drawingView removeFromSuperview];
    [drawingView release];

    drawingView = [[UIImageView alloc] initWithImage:drawingBoard];
    drawingView.frame = CGRectMake(intEtchX, intEtchY, intEtchWidth, intEtchHeight);

    [self.view addSubview:drawingView];
}

Это предполагает, что Вы уже создали drawingView (UIImageView) и чертежную доску (UIImage).

Затем для стирания строки просто сделайте что-то как:

CGContextRef ctx = UIGraphicsGetCurrentContext();
[self eraseStart];
[self contextEraseLine:ctx from:CGPointMake (x1, y1) to:CGPointMake (x2, y2) withThickness:10];
[self eraseEnd];

(замените x1, y1, x2, и y2 с соответствующими значениями)...

6
ответ дан 30 November 2019 в 02:39
поделиться
UIColor *clearColor = [UIColor clearColor];
-13
ответ дан 30 November 2019 в 02:39
поделиться