Удалить линии UIBezirePath, нарисованные на UIImage

Я пытаюсь стереть линии, нарисованные на UIImage. Я успешно стер линии, нарисованные на пустом холсте.

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

  1. используйте точку касания и получите RGB изображения в этой точке и используйте этот цветовой штрих.
  2. colorwithpatternimage работает слишком медленно.

Пожалуйста, предложите любое лучшее решение


person Nabeel Thobani    schedule 21.05.2014    source источник
comment
UIImage ничего не знает о содержимом своего изображения с точки зрения того, что визуально на изображении. Нельзя удалить то, что неизвестно.   -  person Earl Grey    schedule 21.05.2014
comment
я хочу стереть штрихи выше UIImage.   -  person Nabeel Thobani    schedule 21.05.2014
comment
Если они не являются частью объекта UIImage, то упоминать UIImage не имеет смысла. Эти строки находятся в некотором контексте CGContextRef. Вы можете использовать функцию CGContextClearRect.   -  person Earl Grey    schedule 21.05.2014


Ответы (1)


Что я обычно делаю, так это рисую изображение в закадровый буфер (например, CGBitmapContext), рисую поверх него кривые Безье и копирую результат на экран.

Чтобы удалить одну из кривых Безье, я рисую изображение во внеэкранном буфере, рисую все кривые Безье, кроме одной (или тех), которые мне не нужны, а затем копирую результат на экран.

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


РЕДАКТИРОВАТЬ: Вот некоторый псевдокод (никогда не компилируемый - только из памяти), чтобы продемонстрировать, что я имею в виду:

-(UIImage*)drawImageToOffscreenBuffer:(UIImage*)inputImage
{
    CGBitmapContextRef offscreen = CGBitmapContextCreate(...[inputImage width], [inputImage height]...);
    CGImageRef cgImage = [inputImage CGImage];
    CGRect bounds = CGRectMake (0, 0, [inputImage width], [inputImage height]);
    CGContextDrawImage (offscreen, bounds, cgImage);
    // Now iterate through the Beziers you want to draw
    for (i = 0; i < numBeziers; i++)
    {
        if (drawBezier(i))
        {
            CGContextMoveToPoint(offscreen, ...);
            CGContextAddCurveToPoint(offscreen, ...); // fill in your bezier info here
        }
    }

    // Put result into a CGImage
    size_t rowBytes = CGBitmapContextGetBytesPerRow(offscreen);
    CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, CGBitmapContextGetData(offscreen), rowBytes * [inputImage height], NULL);
    CGColorSpaceRef colorSpace = CGBitmapContextGetColorSpace(offscreen);
    CGImageRef cgResult = CGImageCreate([inputImage width], [inputImage height], ..., dataProvider, NULL, false, kCGRenderingIntentDefault);
    CGDataProviderRelease(dataProvider);
    CGColorSpaceRelease(rgbColorSpace);

    // Make a UIImage out of that CGImage
    UIImage* result = [UIImage imageWithCGImage:cgResult];
    // Can't remember if you need to release the cgResult here? I think so
    CGImageRelease(cgResult);
    return result;
}
person user1118321    schedule 21.05.2014
comment
Спасибо, можете поделиться примером? - person Nabeel Thobani; 21.05.2014
comment
Вы можете попробовать вышеперечисленное. Вам нужно будет заполнить некоторые детали, и это в основном по памяти, поэтому может быть несколько ошибок, но это должно вам помочь. - person user1118321; 21.05.2014