2014-05-21 51 views
0

我试图擦除在UIImage上绘制的线。我已经成功擦除了在空画布上绘制的线条。删除在UIImage上绘制的UIBezirePath线

删除UIImage上画线的技巧是什么?下面是我尝试过的一些东西,但无法获得正确的橡皮擦效果。

  1. 使用触摸点并获取该点的图像的RGB,并使用该颜色笔画。
  2. colorwithpatternimage太慢了。

请提出任何更好的解决方案

+0

的UIImage不知道它的图像内容,什么是视觉方面的任何在图像上。你不能删除未知的东西。 –

+0

我想擦除UIImage上方的笔画。 –

+0

如果它们不是UIImage对象的一部分,那么提及UIImage是无关紧要的。这些行在一些CGContextRef上下文中。 您可以使用CGContextClearRect函数。 –

回答

1

我最常做的就是绘制图像的屏幕外缓冲区(说CGBitmapContext,例如),在它上面绘制的贝塞尔曲线,并且将结果复制到屏幕。

要删除其中一个Bezier,我将图像绘制到屏幕外的缓冲区中,绘制除了我不想要的一个(或多个)之外的所有Bezier曲线,然后将结果复制到屏幕上。

这也有一个好处,它避免了可能由于擦除已经在屏幕上的元素而导致的闪烁。如果曲线重叠,它将正常工作,而将图像作为图案进行绘制可能会消除任何重叠点。


编辑:下面是一些伪代码(从未编译 - 刚刚从内存)来证明我的意思:

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

谢谢,你能分享任何例子吗? –

+0

你可以试试以上。你需要填写一些细节,这主要来自记忆,所以可能有一些错误,但它应该让你去。 – user1118321