SkiaSharp如何实现XOR颜色运算模式的可逆图形绘制
SkiaSharp 2.88.0 实现XOR规则可逆图形绘制方案
SkiaSharp 2.88.0 原生支持你所说的、遵循 outColor = srcColor XOR dstColor 规则的可逆图形绘制,效果可以完全对齐WinForms的ControlPaint.DrawReversibleFrame、旧版Windows系统的FocusRects。
实现原理
可逆效果的核心是使用SkiaSharp内置的异或混合模式,该模式会直接对源像素(待绘制图形)和目标像素(画布原有内容)做按位异或运算输出:
- 第一次绘制时,异或运算会生成和原有画布内容高反差的可见图形
- 同一位置、用完全相同的参数第二次绘制同一图形时,两次异或运算会抵消,画布自动还原到第一次绘制前的状态,不需要提前缓存区域像素。
具体实现方法
创建绘制用的SKPaint对象时,将其BlendMode属性设置为SKBlendMode.Xor即可,参考代码如下:
// 定义可逆绘制画笔 using SKPaint reversiblePaint = new SKPaint { Color = SKColors.White, // 颜色可任意选择,异或后会自动和背景形成高对比效果 IsStroke = true, // 绘制边框(比如选框、焦点框)时设为true,填充图形设为false StrokeWidth = 1, IsAntialias = false, // 必须关闭抗锯齿,否则边缘半透明像素会导致二次擦除留残痕 BlendMode = SKBlendMode.Xor // 核心配置:开启异或混合 }; // 第一次调用:在画布指定位置绘制可逆图形 canvas.DrawRect(targetRectangle, reversiblePaint); // 同参数、同位置第二次调用:擦除之前绘制的图形,画布完全还原 canvas.DrawRect(targetRectangle, reversiblePaint);
使用注意事项
- 如果你的画布是带透明通道的格式,建议创建绘制表面时将Alpha类型设置为
SKAlphaType.Opaque,避免异或运算后出现透明像素,破坏可逆效果。 - 两次绘制之间如果有其他绘制操作修改了目标区域的像素,第二次异或绘制将无法完全还原画布内容,这个限制和GDI下的XOR可逆绘制完全一致。
- 除了矩形,所有SkiaSharp支持的绘制元素(直线、椭圆、路径、文本等)都可以通过这个配置实现可逆绘制效果,不局限于焦点框、选框场景。
内容的提问来源于stack exchange,提问作者Björn Albowitz
相关产品推荐
相关产品推荐

