2012-12-21 23 views
7

在Windows Forms中使用GDI +,我希望能够使用笔进行绘制并根据目标像素颜色进行混合。例如,如果我绘制一条线并穿过黑色像素,我希望它是较浅的颜色(例如像白色),以便它可见。当同一条线穿过白色像素时,它应该是较深的颜色(例如黑色),以便它仍然清晰可见。使用GDI +进行高级色彩混合+

有没有办法用GDI +做到这一点?

+0

这将会是难。您可以使用ImageAttributes创建一个TextureBrush,该ImageAttributes使用特制的ColorMatrix来获得此效果。选择不会产生不良色彩偏移的ColorMatrix会非常棘手。 –

+0

@Hans:我使用ColorMatrix工作,但我不知道我可以用什么样的ColorMatrix来做我想做的事。 ColorMatrix不是只是插入我用画笔绘制的图像中的颜色?我需要根据已经用Graphics上下文绘制的背景图像插补颜色。 –

回答

3

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

有一个颜色矩阵可以反转类似于XOR的颜色,问题在于它不适用于中间灰色。该反转RGB和叶阿尔法完整的彩色矩阵将是:

-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慢得多。

+0

所以你说要画我的场景到一个图像缓冲区,然后用一个TextureBrush的图像作为画笔用于绘制我想要的线条。然后在画笔上使用ColorMatrix来反转颜色。但是如果中间灰色附近有任何颜色,它们将不可见? –

+0

准确地说。或者你可以尝试第二种解决方案,但速度较慢,但​​可以提供更多控制。 – Coincoin

1

你可以尝试XORing笔的颜色。 Paint.NET通过选择边框完成此操作,使其可以以任何颜色显示。

+0

你知道他们是如何完成这个的吗?我实际上有一个老版本的Paint.NET的源代码,它的做法与新版本不一样。我使用的代码使用了两支笔,一支白色和一支黑色笔,并使用具有不同偏移的相同短划线模式绘制它们以创建交替的短划线颜色。 –

+0

对不起,不知道。在他们的博客中,他们称之为上下文相关的XOR点画模式。 –

0

哦,我不认为这太难。您可以创建一个笔,根据它自己的位置自动更改颜色。只需读取笔位置的像素(参见示例),获取Alpha组件,并将笔的颜色设置为黑色或白色(如果它分别大于或小于255/2):