GDI+高级颜色混合技术

8
使用Windows Forms和GDI+,我想用钢笔绘制并根据目标像素颜色进行混合。
例如,如果我画一条线并穿过黑色像素,我希望它成为较浅的颜色(例如白色),以便它可见。当同一条线经过白色像素时,它应该是较暗的颜色(例如黑色),以便仍然清晰可见。
是否有办法在GDI+中实现这一点?

那将会很困难。你可以使用一个特别定制的ColorMatrix创建一个带有ImageAttributes的TextureBrush以获得这种效果。挑选不会产生不良色彩偏移的ColorMatrix将是棘手的事情。 - Hans Passant
@Hans:我已经使用ColorMatrix使其正常工作,但我不知道可以使用什么样的ColorMatrix来实现我想要的效果。 ColorMatrix只是在我用刷子绘制的图像中插值颜色吗?我需要根据我已经用Graphics上下文绘制的背景图像插值颜色。 - Trevor Elliott
3个回答

3

正如Hans Passant所提出的那样,您可以使用画布中当前存在的内容作为纹理画笔的图像(您可能需要双缓冲才能正确地工作),并使用ColorMatrix来修改在画布上绘制的颜色。

有一个颜色矩阵可以反转类似于异或的颜色,但问题是它不能与中间灰色一起工作。一个反转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

类似的方法,但速度较慢的方式是将画布复制到图像上,并使用规则逐像素处理该图像,例如如果颜色比0.5亮,则使其略暗,否则使其略亮。然后,您可以使用该处理过的图像作为纹理画笔进行绘制。这会产生更好的结果,但比使用ColorMatrix要慢得多。


所以你的意思是将场景绘制到图像缓冲区,然后使用该图像作为纹理刷子的笔刷来绘制所需的线条。然后在笔刷上使用颜色矩阵来反转颜色。但是如果有任何接近中灰色的颜色,它们将不可见吗? - Trevor Elliott
没错。或者你可以尝试第二种解决方案,虽然速度较慢但是能给你更多的控制权。 - Coincoin

1

您可以尝试使用异或运算来改变笔的颜色。Paint.NET在选择边框上使用这种方法,使其在任何颜色下都可见。


你知道他们是如何实现这个的吗?我有一个旧版本Paint.NET的源代码,它的实现方式与新版本不同。我所拥有的代码使用两个笔,一个白色笔和一个黑色笔,并且使用相同的虚线模式以不同的偏移量绘制它们,以创建交替的虚线颜色。 - Trevor Elliott
抱歉,不知道。在他们的博客上,他们称之为上下文敏感的异或点画图案。 - Peter W.

0

哦,我觉得这并不太难。你可以创建一个笔,根据它所在的位置自动更改颜色。只需读取笔所在位置的像素(参见示例),获取Alpha组件,并根据其是否大于或小于255/2将笔颜色设置为黑色或白色 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接