使用 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)?
在 Docker 上运行的 Mongodb 正在重新启动后擦除集合
如何使用`prepare(_ context: CGContext, with rendererContext: UIGraphicsRendererContext)`?