Nabeel Thobani
Nabeel Thobani

Reputation: 939

Remove UIBezirePath Lines drawn On UIImage

I am trying to erase lines drawn on UIImage. I have successfully erased lines drawn on empty canvas.

What would be the trick of erasing lines drawn on UIImage. Below are some things which I have tried but unable to get correct eraser effect.

  1. use touch point and get RGB of image at that point and used that colour stroke.
  2. colorwithpatternimage is too slow.

Kindly suggest any better solution

Upvotes: 0

Views: 477

Answers (1)

user1118321
user1118321

Reputation: 26395

What I usually do is draw the image to an offscreen buffer (say a CGBitmapContext, for example), draw the Bezier curves over it, and copy the result to the screen.

To remove one of the Beziers, I draw the image to the offscreen buffer, draw all the Bezier curves, except the one (or ones) I don't want, and then copy the result to the screen.

This also has the advantage that it avoids flicker that can be caused by erasing an element that's already onscreen. And it works properly if the curves overlap, whereas drawing with the image as a pattern would likely erase any overlap points.


EDIT: Here's some pseudo-code (never compiled - just from memory) to demonstrate what I mean:

-(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;
}

Upvotes: 1

Related Questions