我正在尝试删除 UIImage
上绘制的线条。我已成功删除在空 Canvas 上绘制的线条。
删除 UIImage
上绘制的线条有什么技巧。以下是我尝试过但无法获得正确橡皮擦效果的一些方法。
- 使用触摸点并获取该点图像的 RGB 并使用该颜色描边。
colorwithpatternimage
太慢。
请提出更好的解决方案
最佳答案
我通常做的是将图像绘制到屏幕外缓冲区(例如 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;
}
关于ios - 删除在 UIImage 上绘制的 UIBezirePath 线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23783465/