首页 文章

C#Color Blend和像Photoshop一样计算不透明度/ alpha

提问于
浏览
2

我有一个图像,我正在尝试处理一个非常具体的外观 . 我在Photoshop中找到了一个教程,并且一步一步地慢慢地重新创建Photoshop效果 . 最新的一种颜色混合模式,我能够工作,但他们添加了一个alpha,它让我难过 .

Photoshop通过创建过滤器,设置颜色,选择“混合”然后应用alpha来完成此操作 . alpha适用于过滤器而不适用于基本图像 .

我正在做的是采用两种颜色,基本图像和叠加颜色进行混合,并将它们转换为HSL . 我正在通过从叠加中获取色调/饱和度以及从基部获取亮度并创建新的HSL颜色来计算混合 . 然后我将其转换为RGB并将该像素写入原始基色的位图 .

我不知道怎么做是应用alpha . 看起来我应该采用混合的基色和产品,并在它们之间形成alpha . 我不确定这是否正确,或者在哪里找到颜色之间的正确计算 .

我没有看到这个问题的代码需要,但如果你需要它,我可以发布一些 .

谢谢

1 回答

  • 0

    我刚刚解决了这个问题(background.png和colorWithAlpha.png具有相同的尺寸):

    Bitmap bg = new Bitmap("background.png");
    Bitmap overlay = new Bitmap("colorWithAlpha.png");
    float m = 0;
    Color c;
    for (int i = 0; i < bg.Width; i++)
    {
        for (int j = 0; j < bg.Height; j++)
        {
            m = overlay.GetPixel(i, j).A / 255f;
            c = HSVtoRGB(overlay.GetPixel(i,j).GetHue(), overlay.GetPixel(i,j).GetSaturation(), bg.GetPixel(i, j).GetBrightness());
            c = Color.FromArgb((int)(m * c.R + (1 - m) * bg.GetPixel(i, j).R), (int)(m * c.G + (1 - m) * bg.GetPixel(i, j).G), (int)(m * c.B + (1 - m) * bg.GetPixel(i, j).B));
            bg.SetPixel(i, j, c);
        }
    }
    

    函数HSVtoRGB取自https://bytes.com/topic/c-sharp/answers/236124-how-would-i-change-hue-bitmap,稍微调整,因为原始函数期望所有输入都是0-255的值,因此必须删除缩放 .

相关问题