我想删除UIImage
上绘制的线条。我已成功擦除在空白画布上绘制的线条。
擦除UIImage
上绘制的线条的技巧是什么?以下是我尝试但无法获得正确橡皮擦效果的一些内容。
colorwithpatternimage
太慢了。请建议任何更好的解决方案
答案 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;
}