在C#中将两个图像相乘,在Photoshop中乘以两个图层

时间:2010-10-01 09:02:24

标签: c# image-processing

我有两个图像,我想在C#中将这两个图像相乘,因为我们在Photoshop中将两个图层相乘。

2 个答案:

答案 0 :(得分:2)

我找到了在photoshop或任何其他应用程序中将图层相乘的方法。

以下是我在GIMP文档中找到的公式。它说

E =(M * I)/ 255

其中M和I是两层的颜色分量(R,G,B)值。我们必须将它应用于每个颜色组件。 E将是该颜色分量的结果值。

如果颜色分量值> 255,则应设置为白色,即255,如果<0,则应将其设置为黑色,即0

答案 1 :(得分:0)

这里我有一个建议 - 我没有测试它,所以对任何错误感到抱歉 - 我也假设两个图像都具有相同的大小并且是greylevel。

基本上我将图像A乘以图像B的相对像素百分比。

你可以尝试不同的公式,如:

int result = ptrB [0] *((ptrA [0] / 255)+ 1); 要么 int result =(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;
    }