📄 algebra.cs
字号:
{
pixel = (bg[i] * fg[i]) / 255;
bg[i] = (byte)pixel;
} // i
bg += BPP;
fg += BPP;
} // x
bg += offset;
fg += offset;
} // y
}
bgImage.UnlockBits(bgData);
fgImage.UnlockBits(fgData);
Bitmap dstImage = (Bitmap)bgImage.Clone();
bgImage.Dispose();
fgImage.Dispose();
return dstImage;
} // end of Multiply
/// <summary>
/// 图像除法运算
/// </summary>
/// <param name="bgImage">背景</param>
/// <param name="fgImage">前景</param>
/// <returns></returns>
private Bitmap Divide(Bitmap bgImage, Bitmap fgImage)
{
int width = bgImage.Width;
int height = bgImage.Height;
BitmapData bgData = bgImage.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData fgData = fgImage.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
unsafe
{
byte* bg = (byte*)bgData.Scan0;
byte* fg = (byte*)fgData.Scan0;
int offset = bgData.Stride - width * BPP;
int pixel = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
for (int i = 0; i < 3; i++)
{
int divisor = fg[i];
// 避免除数为 0
if (divisor == 0) divisor = 1;
pixel = (bg[i] * 255) / divisor;
bg[i] = (byte)pixel;
} // i
bg += BPP;
fg += BPP;
} // x
bg += offset;
fg += offset;
} // y
}
bgImage.UnlockBits(bgData);
fgImage.UnlockBits(fgData);
Bitmap dstImage = (Bitmap)bgImage.Clone();
bgImage.Dispose();
fgImage.Dispose();
return dstImage;
} // end of Divide
/// <summary>
/// 图像平均运算
/// </summary>
/// <param name="bgImage">背景</param>
/// <param name="fgImage">前景</param>
/// <returns></returns>
private Bitmap Average(Bitmap bgImage, Bitmap fgImage)
{
int width = bgImage.Width;
int height = bgImage.Height;
BitmapData bgData = bgImage.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData fgData = fgImage.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
unsafe
{
byte* bg = (byte*)bgData.Scan0;
byte* fg = (byte*)fgData.Scan0;
int offset = bgData.Stride - width * BPP;
int pixel = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
for (int i = 0; i < 3; i++)
{
pixel = (bg[i] + fg[i]) / 2;
bg[i] = (byte)pixel;
} // i
bg += BPP;
fg += BPP;
} // x
bg += offset;
fg += offset;
} // y
}
bgImage.UnlockBits(bgData);
fgImage.UnlockBits(fgData);
Bitmap dstImage = (Bitmap)bgImage.Clone();
bgImage.Dispose();
fgImage.Dispose();
return dstImage;
} // end of Average
/// <summary>
/// 图像求异运算
/// 如果前背景两图像有相同的部分,则使之透明
/// </summary>
/// <param name="bgImage">背景</param>
/// <param name="fgImage">前景</param>
/// <returns></returns>
private Bitmap Differ(Bitmap bgImage, Bitmap fgImage)
{
int width = bgImage.Width;
int height = bgImage.Height;
BitmapData bgData = bgImage.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData fgData = fgImage.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
unsafe
{
byte* bg = (byte*)bgData.Scan0;
byte* fg = (byte*)fgData.Scan0;
int offset = bgData.Stride - width * BPP;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
// 只要RGB三分量相同,则视该像素点相同,将其透明掉
if (bg[0] == fg[0] && bg[1] == fg[1] && bg[2] == fg[2])
{
bg[3] = 0;
bg[2] = bg[1] = bg[0] = 255;
}
bg += BPP;
fg += BPP;
} // x
bg += offset;
fg += offset;
} // y
}
bgImage.UnlockBits(bgData);
fgImage.UnlockBits(fgData);
fgImage.Dispose();
return bgImage;
} // end of Differ
/// <summary>
/// Max 运算
/// </summary>
/// <param name="bgImage">背景</param>
/// <param name="fgImage">前景</param>
/// <returns></returns>
private Bitmap Maximize(Bitmap bgImage, Bitmap fgImage)
{
int width = bgImage.Width;
int height = bgImage.Height;
BitmapData bgData = bgImage.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData fgData = fgImage.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
unsafe
{
byte* bg = (byte*)bgData.Scan0;
byte* fg = (byte*)fgData.Scan0;
int offset = bgData.Stride - width * BPP;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
for (int i = 0; i < 3; i++)
{
bg[i] = (bg[i] > fg[i] ? bg[i] : fg[i]);
} // i
bg += BPP;
fg += BPP;
} // x
bg += offset;
fg += offset;
} // y
}
bgImage.UnlockBits(bgData);
fgImage.UnlockBits(fgData);
Bitmap dstImage = (Bitmap)bgImage.Clone();
bgImage.Dispose();
fgImage.Dispose();
return dstImage;
} // end of Maximize
/// <summary>
/// Min 运算
/// </summary>
/// <param name="bgImage">背景</param>
/// <param name="fgImage">前景</param>
/// <returns></returns>
private Bitmap Minimum(Bitmap bgImage, Bitmap fgImage)
{
int width = bgImage.Width;
int height = bgImage.Height;
BitmapData bgData = bgImage.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData fgData = fgImage.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
unsafe
{
byte* bg = (byte*)bgData.Scan0;
byte* fg = (byte*)fgData.Scan0;
int offset = bgData.Stride - width * BPP;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
for (int i = 0; i < 3; i++)
{
bg[i] = (bg[i] < fg[i] ? bg[i] : fg[i]);
} // i
bg += BPP;
fg += BPP;
} // x
bg += offset;
fg += offset;
} // y
}
bgImage.UnlockBits(bgData);
fgImage.UnlockBits(fgData);
Bitmap dstImage = (Bitmap)bgImage.Clone();
bgImage.Dispose();
fgImage.Dispose();
return dstImage;
} // end of Minimum
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -