ImageMagick .NET 圆形图像重叠问题

ImageMagick .NET Round Image(s) overlap issue

嘿,我有以下 C# 代码:

List<string> lFiles = new List<string>();

lFiles.Add(@"C:\Users\David\Pictures.jpg");
lFiles.Add(@"C:\Users\David\Pictures.jpg");
lFiles.Add(@"C:\Users\David\Pictures.jpg");
IFiles.Add(@"C:\Users\David\Pictures.jpg");
IFiles.Add(@"C:\Users\David\Pictures.jpg");

using (MagickImageCollection images = new MagickImageCollection())
{
    MagickImage magickinput = null;

    foreach (string tempFile in lFiles)
    {
       magickinput = new MagickImage(tempFile);

       magickinput.Alpha(AlphaOption.Set);
       magickinput.Quality = 100;
       magickinput.Resize(0, 100);
       magickinput.Distort(DistortMethod.DePolar, 0);
       magickinput.VirtualPixelMethod = VirtualPixelMethod.HorizontalTile;
       magickinput.BackgroundColor = MagickColors.None;
       magickinput.Distort(DistortMethod.Polar, 0);                        
       images.Add(magickinput);
   }

   var montageSettings = new MontageSettings()
   {
       BackgroundColor = MagickColors.None,
       TileGeometry = new MagickGeometry(lFiles.Count, 1),
       Shadow = true,
       Geometry = new MagickGeometry(-10, 5, 0, 0)
   };

   using (IMagickImage result = images.Montage(montageSettings))
   {
       result.Composite(magickinput, CompositeOperator.DstIn);
       result.Trim();
       result.RePage();

       result.Write(@"C:\Users\David\Pictures\combinedImgs.png");
   }
}

这会产生这样的图像:

请注意,Maggie(第一张图片)周围的区域中有 Lisa(第二张图片),并剪掉了图片 2??? 的一些内容。它还切断了 Marge(最后一张图片)。如果我只是将 Geometry = new MagickGeometry(-10, 5, 0, 0) 设置为 Geometry = new MagickGeometry(5, 5, 0, 0) 然后看起来像这样:

这修复了 Marge(最后一张图片)但 Maggie(第一张图片)看起来仍然很奇怪...

我还注意到所有图像似乎都 "fuzzy" 带有轮廓:

第一张图片是原图,第二张是魔法版。

使用的图像:

Maggie(第一张图片)自己看起来像这样:

我做错了什么?我使用的是 ImageMagick-7.0.7-Q16 版本。

这是我想要的整体外观:

更新

这是我翻译命令行的最大收获:

List<string> lFiles = new List<string>();

lFiles.Add(@"C:\Users\David\Pictures.jpg");
lFiles.Add(@"C:\Users\David\Pictures.jpg");
lFiles.Add(@"C:\Users\David\Pictures.jpg");
lFiles.Add(@"C:\Users\David\Pictures.jpg");
lFiles.Add(@"C:\Users\David\Pictures.jpg");

using (MagickImageCollection images = new MagickImageCollection())
{
       MagickImage magickinput = null;

       foreach (string tempFile in lFiles)
       {
            magickinput = new MagickImage(tempFile);
            IMagickImage _circle = new MagickImage();

            magickinput.Resize(100, 100);
            _circle = new MagickImage(MagickColor.FromRgb(255, 255, 255), magickinput.Width + 20, magickinput.Height);
            _circle.Draw(new DrawableCircle(50, 50, 50, 100));
            _circle.Alpha(AlphaOption.Off);
            //_circle.Compose....????

      }
}

我不确定如何在 C# 中执行以下命令:

xc:black

copy_opacity -layers

dstover -layers

xc:"graya(100%,0)"

+smush

更新 2

这是使用 Imagemagick 6(unix 语法)的另一种方法。我调整图像大小,然后创建一个圆形蒙版,然后使用 -layers composite 和 null: 分隔符将该圆放入每个图像的 alpha 通道,然后将图像混合在一起。

convert maggie.jpg lisa.jpg bart.jpg homer.jpg marge.jpg -resize 100x100 \
null: \
\( -size 100x100 xc:black -fill white -draw "circle 50,50 50,88" \) \
-alpha off -compose copy_opacity -layers composite \
null: \
\( -size 100x100 xc:none -fill black -draw "circle 50,50 50,90" -blur 0x5 \) \
-compose dstover -layers composite \
-background none -gravity center +smush -25+0 \
simpsons_circles2.png

https://www.imagemagick.org/Usage/anim_mods/#composite_single https://www.imagemagick.org/script/command-line-options.php#layers https://www.imagemagick.org/script/command-line-options.php#smush

这将转换为以下 C# 代码(由 dlemstra 提供):

List<string> lFiles = new List<string>();

lFiles.Add(@"C:\Users\David\Pictures.jpg");
lFiles.Add(@"C:\Users\David\Pictures.jpg");
lFiles.Add(@"C:\Users\David\Pictures.jpg");
lFiles.Add(@"C:\Users\David\Pictures.jpg");
lFiles.Add(@"C:\Users\David\Pictures.jpg");

using (MagickImageCollection images = new MagickImageCollection())
{
    foreach (string tempFile in lFiles)
    {
        images.Add(tempFile);
    }

    using (var mask = new MagickImage("xc:black", 100, 100))
    {
        mask.Settings.FillColor = MagickColors.White;
        mask.Draw(new DrawableCircle(50, 50, 50, 88));
        mask.HasAlpha = false;

        foreach (var image in images)
        {
            image.Resize(100, 100);

            image.Composite(mask, CompositeOperator.CopyAlpha);
        }
    }

    using (var shadow = new MagickImage("xc:none", 100, 100))
    {
        shadow.Settings.FillColor = MagickColors.Black;
        shadow.Draw(new DrawableCircle(50, 50, 50, 90));
        shadow.Blur(0, 5);

        foreach (var image in images)
        {
            image.Composite(shadow, CompositeOperator.DstOver);
        }
    }

    images.First().BackgroundColor = MagickColors.None;

    using (IMagickImage result = images.SmushHorizontal(-25))
    {
        result.Write(@"C:\Users\David\Pictures\combinedImgs.png");
    }
}