iOSで自分のタッチで画像を消去しようとしています。ブレンドモードをkCGBlendModeClearに設定することで、これを行うことができますが、ハードエッジのみで行うことができます。ライン幅とアルファを変えてストロークを描くことができましたが、CGContextSetAlphaはkCGBlendModeClearで効果がないようです。CGBitmapContextでソフト消去のストロークを実装するには
どうすればよいですか?
iOSで自分のタッチで画像を消去しようとしています。ブレンドモードをkCGBlendModeClearに設定することで、これを行うことができますが、ハードエッジのみで行うことができます。ライン幅とアルファを変えてストロークを描くことができましたが、CGContextSetAlphaはkCGBlendModeClearで効果がないようです。CGBitmapContextでソフト消去のストロークを実装するには
どうすればよいですか?
私は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の変更が持続しないようにしてください。
注:これは脳がコンパイルされているため、すべてのブレンドモードで透明レイヤーがうまく動作しない可能性があります。その場合は、パス/イメージを2番目のビットマップコンテキストに描画してから、上記のブレンドモードでそのコンテキストの内容を描画してみてください。
また、さまざまな効果のために他のブレンドモードを試すこともできます。
これはうまくいきました - 私はkCGBlendModeDestinationOutを編集しています – user441669