{A}
{S0}简介
我记得我是如何用爱MS PhotoEditor,用于包含在MS Office 2000,它是一个简单而有效的的工具,当你想使图像的透明部分消除了整个图像的特定颜色。那么,这篇文章会告诉你,这是如何成为可能。背景
这个过程背后的想法在于阅读像素的图像像素,并为每个像素,进一步分解为每种颜色的三个基本组成部分的(ARGB):Alpha,红,绿,蓝,分别。我们不重视阅读在这个例子中的alpha,但会写回图像的像素,当谈到。看完后的像素,并获得其RGB分量,我们现在每种颜色的上限和下限的公差值,加入复合材料的上限从原来的值减去它来与较低的颜色限制。最终,我们决定一种颜色与否在于我们前面设置的范围之间的界限,如果是这样,新的颜色是适用于该像素。在透明度的情况下,三色组成无所谓了,所以不管他们,我们只是提高阿尔法因素,其最大的价值,即12月,255或十六进制的FF。使用代码
根据公差值,我们首先定义传递给我们的函数原来的颜色,每个颜色的限制。//Defining Tolerance
//R
iR_Min = Math.Max((int)_colorOld.R - _tolerance, 0);
iR_Max = Math.Min((int)_colorOld.R + _tolerance, 255);
//G
iG_Min = Math.Max((int)_colorOld.G - _tolerance, 0);
iG_Max = Math.Min((int)_colorOld.G + _tolerance, 255);
//B
iB_Min = Math.Max((int)_colorOld.B - _tolerance, 0);
iB_Max = Math.Min((int)_colorOld.B + _tolerance, 255);
然后,我们通过连续的图像像素循环,列的基础上:{C}
一旦被读取一个像素,我们检查它是否属于我们原来的颜色值前面定义的范围内://Determinig Color Match
if(
(c.R >= iR_Min && c.R <= iR_Max) &&
(c.G >= iG_Min && c.G <= iG_Max) &&
(c.B >= iB_Min && c.B <= iB_Max)
)
如果它是一个比赛,然后我们再作检查,但这个时候,写的像素,并检查现在是否是透明的或不更换颜色。if(_colorNew == Color.Transparent)
bmap.SetPixel(x, y, Color.FromArgb(0,
_colorNew.R,
_colorNew.G,
_colorNew.B));
else
bmap.SetPixel(x, y, Color.FromArgb(c.A,
_colorNew.R,
_colorNew.G,
_colorNew.B));
正如你可以看到,如果新的颜色是透明的,我们只是减少的alpha为0;否则,我们使用的alpha值从原来的形象,CA牵强兴趣点
当试图挑选一种颜色从PictureBox,MouseEventArgs坐标不是很准确,仍然不是固定不变的,在这篇文章中,我希望一起,我们可以想些办法。它是如何被管理权现在这里的... ...private void pbPreview_MouseMove(object sender, MouseEventArgs e)
{
if (bPicking)
{
Bitmap bmTemp = (Bitmap)((PictureBox)sender).Image;
pnlOldColor.BackColor = bmTemp.GetPixel(e.X,e.Y);
}
}