You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 01:18:21