Skip to content

Unexpected behavior of Drawables.Draw() when WriteMask exists #1963

@GarthTB

Description

@GarthTB

Magick.NET version

Magick.NET-Q16-x64 14.10.2

Environment (Operating system, version and so on)

Windows 11 26200.7840, .NET 10.0, C# 14.0

Description

I need to apply a solid color to the four rounded corners of an image. Here's my code:

using ImageMagick;
using ImageMagick.Drawing;
using static ImageMagick.CompositeOperator;
using static ImageMagick.MagickColors;

using MagickImage img = new("lena_std.tif");
var (w, h) = (img.Width, img.Height);
var r = .3 * Math.Min(w, h);
using MagickImage mask = new(Black, w, h);
new Drawables().FillColor(White).RoundRectangle(0, 0, w, h, r, r).Draw(mask);
img.SetWriteMask(mask);
using MagickImage colorLayer = new(Aqua, w, h);
img.Composite(colorLayer, Over);
img.RemoveWriteMask();
img.Write("lena_std_mod1.tif");

Make a black-and-white WriteMask and apply it to the target image, then make a solid-color image and Composite. The result is as expected. To minimize intermediate images, I switched to drawing a solid-color rectangle:

img.SetWriteMask(mask);
new Drawables().FillColor(Aqua).Rectangle(0, 0, w, h).Draw(img);
img.RemoveWriteMask();
img.Write("lena_std_mod2.tif");

The result is a transparent center and solid-colored corners, without anything of Lena. Is there a bug or am I using it incorrectly?

Steps to Reproduce

using ImageMagick;
using ImageMagick.Drawing;
using static ImageMagick.CompositeOperator;
using static ImageMagick.MagickColors;

using MagickImage img = new("lena_std.tif");
var (w, h) = (img.Width, img.Height);
var r = .3 * Math.Min(w, h);
using MagickImage mask = new(Black, w, h);
new Drawables().FillColor(White).RoundRectangle(0, 0, w, h, r, r).Draw(mask);
img.SetWriteMask(mask);
using MagickImage colorLayer = new(Aqua, w, h); // Here!
img.Composite(colorLayer, Over);
img.RemoveWriteMask();
img.Write("lena_std_mod1.tif");
using ImageMagick;
using ImageMagick.Drawing;
using static ImageMagick.MagickColors;

using MagickImage img = new("lena_std.tif");
var (w, h) = (img.Width, img.Height);
var r = .3 * Math.Min(w, h);
using MagickImage mask = new(Black, w, h);
new Drawables().FillColor(White).RoundRectangle(0, 0, w, h, r, r).Draw(mask);
img.SetWriteMask(mask);
new Drawables().FillColor(Aqua).Rectangle(0, 0, w, h).Draw(img); // Here!
img.RemoveWriteMask();
img.Write("lena_std_mod2.tif");

Images

lena_std.tif
lena_std_mod1.tif
lena_std_mod2.tif

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions