删除在UIImage上绘制的UIBezirePath线

时间:2014-05-21 12:40:02

标签: ios objective-c drawing uibezierpath erase

我想删除UIImage上绘制的线条。我已成功擦除在空白画布上绘制的线条。

擦除UIImage上绘制的线条的技巧是什么?以下是我尝试但无法获得正确橡皮擦效果的一些内容。

  1. 使用触摸点并在该点获取图像的RGB并使用该颜色笔划。
  2. colorwithpatternimage太慢了。
  3. 请建议任何更好的解决方案

1 个答案:

答案 0 :(得分: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;
}