编程语言
首页 > 编程语言> > 使用具有抗锯齿功能的C#更改抗锯齿图像的背景颜色

使用具有抗锯齿功能的C#更改抗锯齿图像的背景颜色

作者:互联网

我有一个图像,我需要更改背景颜色(例如,将下面的示例图像的背景更改为蓝色).

但是,图像是消除锯齿的,所以我不能简单地用不同的颜色替换背景颜色.

我试过的一种方法是创建第二个图像,它只是背景并改变它的颜色并将两个图像合并为一个,但是这不起作用,因为两个图像之间的边界是模糊的.

有没有办法做到这一点,或其他一些方法来实现这一点,我没有考虑?

Example image

解决方法:

抽象地

图像中的每个像素都是(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