c# - 使用 GDI+ 进行高级颜色混合

标签 c# winforms colors gdi+ blending

将 GDI+ 与 Windows 窗体结合使用,我希望能够使用钢笔绘图并根据目标像素颜色混合颜色。

例如,如果我画一条线并且它经过黑色像素,我希望它是较浅的颜色(例如白色)以便它可见。当同一条线经过白色像素时,它应该是较暗的颜色(例如黑色),这样它仍然清晰可见。

有什么方法可以用 GDI+ 做到这一点吗?

最佳答案

正如 Hans Passant 所建议的那样,您可以使用 Canvas 中当前的图像作为纹理画笔的图像进行绘画(您可能需要双缓冲才能使其正常工作)并使用 ColorMatrix 修改在 Canvas 上绘制的颜色。

有一个颜色矩阵可以反转类似于异或的颜色,问题是它不适用于中间灰色。反转 RGB 并保持 alpha 不变的颜色矩阵是:

-1, 0, 0, 0, 0
 0,-1, 0, 0, 0
 0, 0,-1, 0, 0
 0, 0, 0, 1, 0
 1, 1, 1, 0, 1

类似的方法是将 Canvas 复制到图像,并使用规则处理每个像素的图像像素,例如如果颜色比 0.5 亮,则使其稍微暗一些,否则使其稍微亮一些。然后,您使用该处理过的图像作为纹理画笔进行绘画。这会提供更好的结果,但会比使用 ColorMatrix 慢得多。

关于c# - 使用 GDI+ 进行高级颜色混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13997178/

相关文章:

c# - 当 SaveFileDialog 被取消时,我该如何处理 "do something"?

java - 使用拉绳将字符串写入图像时更改颜色

php - 通过 MySQL 的全日历动态事件颜色

c# - 我可以创建第一个参数不同的函数字典吗?

c# - 如何在不将变量分配给异常的情况下在调试器中查看异常详细信息?

c# - C# 中大型 bool 数组的问题

c# - 组合框问题 : Cannot bind to new value member

c# - 在 C# 窗体之间传递列表

c# - NET 3.5 中的 c# 应用程序/解决方案,但需要引用 NET 4.0

javascript - jquery颜色变化