使用 CGContext 绘制后擦除

Posted

技术标签:

【中文标题】使用 CGContext 绘制后擦除【英文标题】:Erasing after drawing with CGContext 【发布时间】:2011-05-09 15:31:41 【问题描述】:

我正在尝试为 iPad 做一个简单的绘图应用程序,您可以在其中在图片上绘图,我正在使用 CGContext 的东西来做,但我最初计划处理擦除的方式是只用白色...除了我今天才意识到,当你在另一个图像上绘图时它不起作用,因为当你“擦除”时,你也会“擦除”背景图像。

有没有办法支持实际擦除?

谢谢!

【问题讨论】:

【参考方案1】:

我还需要擦除功能。根据@Jeremy 的回答,这对我有用:

CGContextRef cgref = UIGraphicsGetCurrentContext();

if(erase == TRUE) // Erase to show background

    CGContextSetBlendMode(cgref, kCGBlendModeClear);

else // Draw with color

    CGContextSetBlendMode(cgref, kCGBlendModeNormal);

【讨论】:

你是我的英雄,非常感谢你提供这么简单的解决方案! 首先,我将学习 Ray Wenderlich 的创建简单绘图应用程序的教程。一切都适用,但是当我将混合模式更改为 kCGBlendModeClear 时,它所做的只是在调用触摸结束时擦除整个画布。有什么想法吗? 非常好,虽然太冗长了。你也可以用单线做同样的事情:CGContextSetBlendMode(UIGraphicsGetCurrentContext(), erase ? kCGBlendModeClear : kCGBlendModeNormal);【参考方案2】:

在图像上方的图层中显示用户的绘图。然后擦除就像在绘图层上画一个透明补丁一样简单,以便让其下方的图像像素显示出来。

【讨论】:

如何绘制透明补丁?我使用了 alpha 为 0.0 的 CGContextSetRGBStrokeColor,但这似乎不起作用。 使用合成模式(例如,复制而不是 SourceIn)并考虑填充和描边。 这是一个空无一物的汉堡。应该是评论,而不是答案。【参考方案3】:

清除所有 CGContextRef 图纸:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, self.bounds);
[self setNeedsDisplay];

【讨论】:

以上是关于使用 CGContext 绘制后擦除的主要内容,如果未能解决你的问题,请参考以下文章

CGContext:如何擦除位图上下文之外的像素(例如 kCGBlendModeClear)?

Python子进程 - stderr在读取后擦除

在 Docker 上运行的 Mongodb 正在重新启动后擦除集合

如何使用`prepare(_ context: CGContext, with rendererContext: UIGraphicsRendererContext)`?

为 PaintCode CGContext 自动调整标签中的文本

如何使用 CGContext 方法清除旧数据的绘制?