我正在编写一个程序,使用遮罩(叠加图像)从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);
}
}
}
答案 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;
}
用法:假设图片的编号与您在问题中发布的图片一样,我们有image1
,image2
,image3
个变量:
image3 = ExtractBaseImage((Bitmap)image1, (Bitmap)image2);