如何避免在 SkiaSharp 中“叠加”不透明度

Posted

技术标签:

【中文标题】如何避免在 SkiaSharp 中“叠加”不透明度【英文标题】:How to avoid "adding up" of opacities in SkiaSharp 【发布时间】:2017-12-12 15:48:25 【问题描述】:

我目前正在创建一个 Xamarin.Forms 应用程序。我的一个页面使用 SkiaSharp 允许用户以文本标记样式(即不透明度低的黄色画笔)突出显示图像的某些部分。

这是相关的 SKPaint 对象的定义方式:

var strokePaint = new SKPaint()

    Color = Color.FromRgba(255, 255, 0, 100).ToSKColor(),
    Style = SKPaintStyle.Stroke,
    StrokeWidth = StrokeWidth
;

到目前为止一切正常,但令我困扰的是,当我有多个重叠路径时,不透明度会“增加”,直到某个时候底层图片不再可见。

我能做些什么来避免这种重叠?我正在考虑将所有路径合并为一个,但这似乎不起作用,因为允许用户在笔划之间更改 StrokeWidth,而且我没有看到任何绘制宽度不同的路径的方法。

我希望你们中的任何人都对我有所帮助。任何想法表示赞赏!

【问题讨论】:

我对 Skia 不是很熟悉,但我查看了SKPaint 的文档,它看起来有一个BlendMode 属性。根据类似事物在其他系统中的工作方式,应该控制颜色的组合方式。您可能必须尝试不同的值才能获得所需的效果。 DstModulate 看起来是不错的候选人。 【参考方案1】:

我对 Skia 不是很熟悉,但我查看了 SKPaint 的文档,看起来它有一个 BlendMode 属性。根据类似事物在其他系统中的工作方式,应该控制颜色的组合方式。您可能必须尝试不同的值才能获得所需的效果。 Dst 或 Modulate 看起来不错。 ——布拉德利·乌夫纳

感谢您的回答布拉德利!我使用Darken 混合模式并将不透明度设置为 255,这在突出显示文本时会产生非常好的效果(只有较暗的颜色可见,因此浅色背景上的深色文本在我的标记颜色背景上变成深色文本) .

【讨论】:

以上是关于如何避免在 SkiaSharp 中“叠加”不透明度的主要内容,如果未能解决你的问题,请参考以下文章

如何在Kivy(Python)中叠加2个布局?

如何在背景图像上添加叠加不透明度? [复制]

C# SkiaSharp OpenTK Winform - 如何从后台线程中绘制?

如何使用 CSS 为图像添加低调(黑色、透明叠加)效果?

jquery ui draggable中如何避免div叠加?

PHP中Photoshop叠加与不透明度的融合