C#从2张图像中变暗效果

时间:2017-05-10 14:03:44

标签: c#

正如标题所说,我试图制作一个变暗的效果(就像在Photoshop中一样)。到目前为止,我有2个图片框,每张图片一个,然后是输出的第三个图片框。输出应该是前两个的位图,并且应用了暗化效果。看起来像这样 - http://i.imgur.com/zlpUD2D.png

if (pixelA <= pixelB) {pixelC = pixelA}
if (pixelA > pixelB) {pixelC = pixelB}

这是变暗效果的主要逻辑,但我不知道如何在我的程序中实现它。 这是我的Form1类

public void applyEffect(string Method)
        {
            imgData3 = new imgData(imgData1.img.GetLength(0), imgData1.img.GetLength(1));

        for (int x = 0; x < imgData1.img.GetLength(0); x++)
        {
            for (int y = 0; y < imgData1.img.GetLength(1); y++)
            {
                imgData3.img[x, y] = new rgbiPixels();
                switch(Method)
                {
                    case "Darken":
                        {
                            imgData3.img[x, y].effectDarken(imgData1.img[x, y], imgData2.img[x, y]);
                            break;
                        }
                }
            }
        }
        pictureBox3.Image = imgData3.drawImage();
    }

这是我的rgbiPixels类,我应该只将一个像素变暗,因为其余部分在Form1类中都要小心。

public class rgbiPixels
    {
        public byte R;
        public byte G;
        public byte B;
        public byte I;

    public rgbiPixels()
    {
        R = 0;
        G = 0;
        B = 0;
        I = 0;
    }

    public rgbiPixels(byte r, byte g, byte b)
    {
        R = r;
        G = g;
        B = b;
        I = (byte)Math.Round(0.0722f * b + 0.7152f * g + 0.2126f * r);
    }


    //--------------------------------------------------
    public void effectDarken(rgbiPixels a, rgbiPixels b)
    {
        R = Convert.ToByte(a.R + b.R);
        G = Convert.ToByte(a.G + b.G);
        B = Convert.ToByte(a.B + b.B);
    }
    //--------------------------------------------------
}

所以我的问题是如何将我的逻辑实现到rgbiPixels类中?

1 个答案:

答案 0 :(得分:0)

根据您的伪代码规范,effectDarken应该是一个函数,应该比较像素强度,并且可以像这样实现:

public rgbiPixels effectDarken(rgbiPixels a, rgbiPixels b)
{
    return (a.I <= b.I) ? a : b;
}

如果你保留void方法,结果颜色将没有I的正确值,因为它只在构造函数中计算(你可能不在乎,只是作为预防措施)。