如何在CGBitmapContext中实现软橡皮擦笔划

时间:2011-10-17 22:57:10

标签: objective-c cocoa-touch

我试图在iOS中用我的触摸擦除图像。通过将混合模式设置为kCGBlendModeClear,我能够做到这一点 - 但只能使用硬边。我可以用不同的线宽和alpha来绘制我的笔画,但看起来CGContextSetAlpha对kCGBlendModeClear没有效果。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

我会使用与kCGBlendModeDestinationOutDa * (1 - Sa), Dc * (1 - Sa)合成的透明层。)像这样:

CGPathRef pathToErase = ...; // The path you want erased
// could also be an image or (nearly) anything else
// that can be drawn in a bitmap context

CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut);
CGContextBeginTransparencyLayer(ctx, NULL);
{
    CGContextSetGrayFillColor(ctx, 0.0, 1.0); // solid black

    CGContextAddPath(ctx, pathToErase);
    CGContextFillPath(ctx);
    // the above two lines could instead be CGContextDrawImage()
    // or whatever else you're using to clear
}
CGContextEndTransparencyLayer(ctx);

请注意,您还应该在透明层之前/之后保存并恢复gstate(CGContextSaveGState() / CGContextRestoreGState()),以确保混合模式和任何其他gstate更改不会持久存在。

注意:这是大脑编译的,透明层可能不适合所有混合模式。如果是这样,请尝试将路径/图像绘制到第二个位图上下文中,然后使用上述混合模式绘制该上下文的内容。

您还可以尝试其他混合模式以获得不同的效果。