gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:56:46 26 4
gpt4 key购买 nike

我正在尝试删除 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com