[英]Multiply two images in C# as multiply two layers in Photoshop
我有两个图像,我想在C#中将这两个图像相乘在一起,因为我们在Photoshop中相乘了两个图层。
我发现了在photoshop或任何其他应用程序中将图层相乘的方法。
以下是我在GIMP文档中找到的公式。 它说
E =(M * I)/ 255
其中M和I是两层的颜色分量(R,G,B)值。 我们必须将此应用于每个颜色组件。 E将是该颜色分量的结果值。
如果颜色分量值> 255,则应将其设置为白色,即255;如果颜色值<0,则应将其设置为黑色,即0
在这里,我有一个建议-我没有测试过,很抱歉出现任何错误-我还假设两个图像的大小相同且为灰度级。
基本上,我将图像A乘以图像B的相对像素百分比。
您可以尝试不同的公式,例如:
int结果= ptrB [0] *((ptrA [0] / 255)+1); 或int结果=(ptrB [0] * ptrA [0])/ 255;
永远不要忘记检查溢出(超过255)
public void Multiply(Bitmap srcA, Bitmap srcB, Rectangle roi)
{
BitmapData dataA = SetImageToProcess(srcA, roi);
BitmapData dataB = SetImageToProcess(srcB, roi);
int width = dataA.Width;
int height = dataA.Height;
int offset = dataA.Stride - width;
unsafe
{
byte* ptrA = (byte*)dataA.Scan0;
byte* ptrB = (byte*)dataB.Scan0;
for (int y = 0; y < height; ++y)
{
for (int x = 0; x < width; ++x, ++ptrA, ++ptrB)
{
int result = ptrA[0] * ( (ptrB[0] / 255) + 1);
ptrA[0] = result > 255 ? 255 : (byte)result;
}
ptrA += offset;
ptrB += offset;
}
}
srcA.UnlockBits(dataA);
srcB.UnlockBits(dataB);
}
static public BitmapData SetImageToProcess(Bitmap image, Rectangle roi)
{
if (image != null)
return image.LockBits(
roi,
ImageLockMode.ReadWrite,
image.PixelFormat);
return null;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.