Как мне реализовать мягкий ластик в CGBitmapContext - PullRequest
1 голос
/ 18 октября 2011

Я пытаюсь стереть изображение с помощью касания в iOS. Установив режим смешивания на kCGBlendModeClear, я могу сделать это - но только с твердыми краями. Я мог бы нарисовать свой штрих с различной шириной линии и альфа-каналом, но кажется, что CGContextSetAlpha не имеет эффекта с kCGBlendModeClear.

Как мне это сделать?

1 Ответ

2 голосов
/ 18 октября 2011

Я бы использовал прозрачный композитный слой с kCGBlendModeDestinationOut (Da * (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 не сохраняются.

Примечание: Это компилируется мозгом, и возможно, что слои прозрачности неиграть хорошо со всеми режимами наложения.Если это так, попробуйте нарисовать путь / изображение во втором растровом контексте, а затем нарисовать содержимое этого контекста в вышеуказанном режиме наложения.

Вы также можете поэкспериментировать с другими режимами наложения для получения различных эффектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...