我試圖擦除在UIImage
上繪製的線。我已經成功擦除了在空畫布上繪製的線條。刪除在UIImage上繪製的UIBezirePath線
刪除UIImage
上畫線的技巧是什麼?下面是我嘗試過的一些東西,但無法獲得正確的橡皮擦效果。
- 使用觸摸點並獲取該點的圖像的RGB,並使用該顏色筆畫。
colorwithpatternimage
太慢了。
請提出任何更好的解決方案
我試圖擦除在UIImage
上繪製的線。我已經成功擦除了在空畫布上繪製的線條。刪除在UIImage上繪製的UIBezirePath線
刪除UIImage
上畫線的技巧是什麼?下面是我嘗試過的一些東西,但無法獲得正確的橡皮擦效果。
colorwithpatternimage
太慢了。請提出任何更好的解決方案
我最常做的就是繪製圖像的屏幕外緩衝區(說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;
}
謝謝,你能分享任何例子嗎? –
你可以試試以上。你需要填寫一些細節,這主要來自記憶,所以可能有一些錯誤,但它應該讓你去。 – user1118321
的UIImage不知道它的圖像內容,什麼是視覺方面的任何在圖像上。你不能刪除未知的東西。 –
我想擦除UIImage上方的筆畫。 –
如果它們不是UIImage對象的一部分,那麼提及UIImage是無關緊要的。這些行在一些CGContextRef上下文中。 您可以使用CGContextClearRect函數。 –