返回首页

{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);

    }

}

回答

评论会员:DreamWalkerTg 时间:2012/01/25
我认为使用Bitmap.SetPixel()和Bitmap.GetPixel()是很慢的代码
你可以有很好的优化你的代码,使用标准方法。
您可以绘制您的图像与图形
Graphics.DrawImage(图像,数组[]()[],矩形,GraphicsUnit,ImageAttributes)
类ImageAttributes包含一个RemapTable。您可以取代任何颜色,任何其他颜色与RemapTable
使用这种方式从MSDN的例子:
私人无效SetRemapTableExample(PaintEventArgs的E)
{

- ; / /创建一个填充,红色的形象,并把它保存到Circle2.jpg
。 - ; 位图MYBITMAP =新的Bitmap(50,50);
- ; 图形G = Graphics.FromImage(MYBITMAP);
- ; g.Clear(Color.White)
- ; g.FillEllipse(新SolidBrush(Color.Red),
- ; 新的Rectangle(0,0,50,50))
- ; myBitmap.Save("Circle2.jpg");

/ /创建一个Image对象从Circle2.jpg文件,并绘制它

/ /屏幕
- ; 图像myImage = Image.FromFile("Circle2.jpg");
- ; e.Graphics.DrawImage(myImage,20,20);

/ /创建一个彩色地图
。 colormap的[] myColorMap =新的colormap中[1]
- ; myColorMap [0] =新的colormap中()
myColorMap [0] OldColor = Color.Red;
- ; NBSP。myColorMap [0] NewColor = Color.Green;

/ /创建一个ImageAttributes对象,然后通过
/ / myColorMap对象的SetRemapTable方法
。 - ; ImageAttributes imageAttr =新ImageAttributes();
- ; imageAttr.SetRemapTable(myColorMap)

/ /绘制的形象重新映射表集
- ; 矩形RECT =新的Rectangle(150,20,50,50);
- ; e.Graphics.DrawImage(myImage,矩形,0,0,50,50,
- ; GraphicsUnit.Pixel,imageAttr);

} *此源代码是突出{A2}

{A3}
评论会员:约翰尼Goodbull 时间:2012/01/25
感谢队友!永远不知道

我们将找到一种方法,或做一个!
(\ /)
- ( - .-)
彗星(''')('''){ BR}