Search code examples
c#imagesharp

How to compose two images (using Source In composition)?


I need to perform Source In composition on 2 images.

For example this image:
Source
and a mask image (tested with black-transparent and black-white):
mask

should produce result:
result image

I am trying to do this with ImageSharp:

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

but result is mask image. It should work based on this merge request.
Did I wrongly used library, or there is a bug?

Is there any other way to do this in ASP.NET Core?


Solution

  • Unfortunately, the syntax to do this is with ImageSharp is changing between the current preview version and the development version which should be the final API for this.

    With 1.0.0-beta0005, you can blend these images like this:

    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");
        }
    }
    

    Note that you have to use a pattern image with alpha transparency for this. You cannot use a keyed transparency (at least not with this solution).

    I’ve made the pattern transparent for that purpose (you can get the one I used here) and got this result:

    Result image


    In the final release, it will look like this:

    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");
        }
    }
    

    A good way to figure that out btw. is to look at the PorterDuffCompositorTests file which contains the tests for this feature and as such will always reflect the current API.