使用具有抗锯齿功能的C#更改抗锯齿图像的背景颜色
作者:互联网
我有一个图像,我需要更改背景颜色(例如,将下面的示例图像的背景更改为蓝色).
但是,图像是消除锯齿的,所以我不能简单地用不同的颜色替换背景颜色.
我试过的一种方法是创建第二个图像,它只是背景并改变它的颜色并将两个图像合并为一个,但是这不起作用,因为两个图像之间的边界是模糊的.
有没有办法做到这一点,或其他一些方法来实现这一点,我没有考虑?
解决方法:
抽象地
图像中的每个像素都是(R,G,B)向量,其中每个分量都在[0,1]范围内.您需要一个变换T,它将在以下约束条件下将图像中的所有像素转换为新的(R’,G’,B’):
>黑色应该保持黑色
> T(0,0,0)=(0,0,0)
>白色应成为您选择的颜色C *
> T(1,1,1)= C *
一种直接的方法是选择以下转换T:
T(c) = C* .* c (where .* denotes element-wise multiplication)
这只是标准的图像倍增.
具体
如果您不担心性能,可以使用Bitmap上的(非常慢)方法GetPixel和SetPixel为其中的每个像素应用此变换.如果不清楚如何做到这一点,请在评论中这样说,我将为该部分添加详细说明.
对照
将此与LarsTech提出的方法进行比较.这里介绍的方法是最重要的; LarsTech提出的方法是最底层的.注意底部图标上的不良边缘效应(边缘上的白色雾度).
以下是两者的图像差异:
事后
如果源图像具有透明(即透明 – 白色)背景和黑色前景(如示例所示),则可以简单地使变换T(a,r,g,b)=(a,0,0,0)然后,正如LarsTech建议的那样,将您的图像绘制在您想要的任何背景颜色之上.
标签:c,graphics,antialiasing 来源: https://codeday.me/bug/20190714/1454912.html