使用蒙版图像删除图像叠加

时间:2013-11-22 10:49:13

标签: c# image graphics lockbits

我正在编写一个程序,使用遮罩(叠加图像)从png图像中删除叠加层

拥有图像1和2我想要获得图像3。

我尝试过使用lockbits并尝试过很多东西,但我认为我无法做正确的数学

rgbValues是overlay的字节数组,rgbValues2是给定图像的字节数组。

for (int counter = 0; counter < rgbValues.Length; counter ++)
            {
                int x = (counter / 4) * 4;
                if (rgbValues[x + 3] != 0)
                {
                    if (rgbValues[x + 3] == rgbValues2[x + 3])
                    {
                        rgbValues2[counter] = 0;
                    }
                    else
                    {
                        float a1 = (float)rgbValues[counter];
                        float a2 = (float)rgbValues2[counter] ;
                        float b1 = (float)rgbValues[x + 3];
                        float b2 = (float)rgbValues2[x + 3];
                        rgbValues2[counter] = (byte)(2 * a2- a1);
                    }
                }
            }

enter image description here

1 个答案:

答案 0 :(得分:1)

我已尝试使用您的示例图像,尽管它们由同一个大图像组成,看起来很有效。为简单起见,下面的代码不使用LockBits,它只是给你一个想法,即如何从混合颜色(在第二个图像中)和结果颜色计算基色(在第三个图像中) (在第一张图片中):

public Image ExtractBaseImage(Bitmap resultImage, Bitmap blendImage) {
    Bitmap bm = new Bitmap(resultImage.Width, resultImage.Height);
    for (int i = 0; i < resultImage.Width; i++) {
        for (int j = 0; j < resultImage.Height; j++) {
           Color resultColor = resultImage.GetPixel(i, j);
           Color blendColor = blendImage.GetPixel(i, j);
           if (blendColor.A == 0) bm.SetPixel(i, j, resultColor);
           else if(blendColor != resultColor){
              float opacity = blendColor.A / 255f;
              int r = Math.Max(0,Math.Min(255,(int) ((resultColor.R - (opacity) * blendColor.R) / (1-opacity))));
              int g = Math.Max(0,Math.Min(255,(int)((resultColor.G - (opacity) * blendColor.G) / (1-opacity))));
              int b = Math.Max(0,Math.Min(255,(int)((resultColor.B - (opacity) * blendColor.B) / (1-opacity))));                        
              bm.SetPixel(i,j,Color.FromArgb(r,g,b));
           }
        }
    }
    return bm;
}

用法:假设图片的编号与您在问题中发布的图片一样,我们有image1image2image3个变量:

image3 = ExtractBaseImage((Bitmap)image1, (Bitmap)image2);