ios - 删除在 UIImage 上绘制的 UIBezirePath 线

标签 ios objective-c drawing uibezierpath erase

我正在尝试删除 UIImage 上绘制的线条。我已成功删除在空 Canvas 上绘制的线条。

删除 UIImage 上绘制的线条有什么技巧。以下是我尝试过但无法获得正确橡皮擦效果的一些方法。

  1. 使用触摸点并获取该点图像的 RGB 并使用该颜色描边。
  2. 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/

相关文章:

IOS:用手指画一条线

ios - PresentModalViewController 一旦应用程序从 Framework 启动

ios - UIScrollView:在 scrollViewDidScroll 中获得更好的 contentOffset 预测:

ios - 使用 AVFoundation 将 AAC 音频和 h.264 视频流复用到 mp4

iphone - 我怎样才能设置 iphone 在预先安排的日期调用电话?

android - 带 alpha channel 的位图着色器。 (Alpha 正在画黑..?)

ios - 同时对 2 个或更多位置进行地理编码

ios - 如何使用 objc 访问此数据集中的元素?

iphone - 如何在 Objective-C 中使用 C 语言数组

c++ - 如何使用 CImg 库绘制一个简单的函数?