2

嘿,我有以下 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");
   }
}

这会产生这样的图像:

在此处输入图像描述

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

在此处输入图像描述

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

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

在此处输入图像描述 在此处输入图像描述

第一张是原图,第二张是Magick版。

使用的图像:

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

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

在此处输入图像描述

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

这是我想要的整体外观:

在此处输入图像描述

更新

这是我在翻译命令行时所得到的:

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:黑色

复制不透明层

dstover 层

xc:"graya(100%,0)"

+糊涂

更新 2

在此处输入图像描述

4

1 回答 1

3

这是使用 Imagemagick 6(unix 语法)的不同方法。我调整图像的大小,然后创建一个圆形遮罩,然后使用带有 null: 分隔符的 -layers 合成将该圆形放入每个图像的 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/命令行选项.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");
    }
}
于 2018-03-18T18:11:26.913 回答