c# - ImageMagick .NET 圆形图像重叠问题

标签 c# imagemagick imagemagick-convert magick.net

嘿,我有以下 C# 代码:

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

lFiles.Add(@"C:\Users\David\Pictures\1.jpg");
lFiles.Add(@"C:\Users\David\Pictures\2.jpg");
lFiles.Add(@"C:\Users\David\Pictures\3.jpg");
IFiles.Add(@"C:\Users\David\Pictures\4.jpg");
IFiles.Add(@"C:\Users\David\Pictures\5.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");
   }
}

这会产生如下图像:

enter image description here

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

enter image description here

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

我还注意到所有图像的轮廓似乎都“模糊”:

enter image description here enter image description here

第一张图片是原始图片,第二张图片是 Magick 版本。

使用的图像:

enter image description here enter image description here enter image description here enter image description here enter image description here

玛吉(第一张图片)本身看起来像这样:

enter image description here

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

这就是我想要的整体外观:

enter image description here

更新

这是我翻译命令行所得到的信息:

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

lFiles.Add(@"C:\Users\David\Pictures\1.jpg");
lFiles.Add(@"C:\Users\David\Pictures\2.jpg");
lFiles.Add(@"C:\Users\David\Pictures\3.jpg");
lFiles.Add(@"C:\Users\David\Pictures\4.jpg");
lFiles.Add(@"C:\Users\David\Pictures\5.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

enter image description here

最佳答案

这是使用 Imagemagick 6(unix 语法)的不同方法。我调整图像大小,然后创建一个圆形蒙版,然后使用 -layers 与 null: 分隔符合成,将该圆形放入每个图像的 Alpha channel 中,然后将图像混合在一起。

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

enter image description here

查看 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\1.jpg");
lFiles.Add(@"C:\Users\David\Pictures\2.jpg");
lFiles.Add(@"C:\Users\David\Pictures\3.jpg");
lFiles.Add(@"C:\Users\David\Pictures\4.jpg");
lFiles.Add(@"C:\Users\David\Pictures\5.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");
    }
}

关于c# - ImageMagick .NET 圆形图像重叠问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49345381/

相关文章:

c# - 将列表从 IronPython 传递到 C#

text - 向ImageMagick添加文本时标题,绘制,注释,标签之间的区别

imagemagick - 如何更改 imagemagick 的临时路径?

php - 使用 imagemagick 更快地检测图像中几个最亮点的方法?

ImageMagick:缩小图像尺寸

c# - 使用 c# 使用 youtube api 添加缩略图?

c# - 正则表达式分割并忽略括号

c# - 是否可以从 View 中通过 Linq-to-sql 更新记录?

linux - Imagemagick use-trimbox 根本不起作用

imagemagick - 无法在 ImageMagick : "convert: no decode delegate for this image format" 中创建缩略图