如何合成两个图像(使用合成中的源)?

时间:2018-10-18 13:46:36

标签: c# imagesharp

我需要对2张图像执行Source In composition

例如,此图像:
Source
和遮罩图像(经过黑色透明和黑白测试):
mask

应产生结果:
result image

我正在尝试使用ImageSharp来做到这一点:

img.Mutate(imgMaskIn =>
{
    using (var mask = Image.Load(maskImageFileName))
    {
        imgMaskIn.DrawImage(mask, new GraphicsOptions { AlphaCompositionMode = PixelAlphaCompositionMode.SrcIn});
    }
});

但结果是蒙版图像。它应该基于this merge request运行。
我是错误地使用了库,还是有错误?

在ASP.NET Core中还有其他方法吗?

1 个答案:

答案 0 :(得分:2)

不幸的是,使用ImageSharp的语法在当前预览版本和开发版本之间发生了变化,应该将其作为最终的API。

使用1.0.0-beta0005,您可以像这样混合这些图像:

using (var pattern = Image.Load("img_pattern.png"))
using (var texture = Image.Load("img_texture.png"))
{
    var options = new GraphicsOptions { BlenderMode = PixelBlenderMode.In };
    using (var result = pattern.Clone(x => x.DrawImage(options, texture)))
    {
        result.Save("img_out.png");
    }
}

请注意,您必须为此使用具有alpha透明度的图案图像。您不能使用键控透明度(至少不使用此解决方案)。

为此,我已经将图案透明化了(您可以get the one I used here)并得到以下结果:

Result image


在最终版本中,它将如下所示:

using (var pattern = Image.Load("img_pattern.png"))
using (var texture = Image.Load("img_texture.png"))
{
    var options = new GraphicsOptions { AlphaCompositionMode = PixelAlphaCompositionMode.SrcIn };
    using (var result = pattern.Clone(x => x.DrawImage(texture, options)))
    {
        result.Save("img_out.png");
    }
}

一个很好的方法来解决这个问题。是查看PorterDuffCompositorTests file,其中包含对此功能的测试,因此将始终反映当前的API。