使用Windows Forms和GDI+,我想用钢笔绘制并根据目标像素颜色进行混合。
例如,如果我画一条线并穿过黑色像素,我希望它成为较浅的颜色(例如白色),以便它可见。当同一条线经过白色像素时,它应该是较暗的颜色(例如黑色),以便仍然清晰可见。
是否有办法在GDI+中实现这一点?
例如,如果我画一条线并穿过黑色像素,我希望它成为较浅的颜色(例如白色),以便它可见。当同一条线经过白色像素时,它应该是较暗的颜色(例如黑色),以便仍然清晰可见。
是否有办法在GDI+中实现这一点?
正如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
要慢得多。
您可以尝试使用异或运算来改变笔的颜色。Paint.NET在选择边框上使用这种方法,使其在任何颜色下都可见。
哦,我觉得这并不太难。你可以创建一个笔,根据它所在的位置自动更改颜色。只需读取笔所在位置的像素(参见示例),获取Alpha组件,并根据其是否大于或小于255/2将笔颜色设置为黑色或白色 :)