2014-05-21 90 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