簡體   English   中英

將C#中的兩個圖像相乘作為Photoshop中的兩個圖層相乘

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM