【问题标题】:ImageMagick .NET Round Image(s) overlap issueImageMagick .NET 圆形图像重叠问题
【发布时间】:2018-08-26 23:24:11
【问题描述】:

大家好,我有以下 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版本。

使用的图片:

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

我做错了什么?我使用的是 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:黑色

copy_opacity -layers

dstover 层

xc:"graya(100%,0)"

+smush

更新 2

【问题讨论】:

  • Imagemagick 的版本,请发布您的输入图像。与蒙太奇相比,-smush 是否也会发生同样的想法?
  • 你也可以添加所需的输出吗?
  • 更新了我的 OP 以显示我想要实现的目标。
  • 更新了我的 OP 以显示我到目前为止的 C# 代码@dlemstra

标签: c# imagemagick imagemagick-convert magick.net


【解决方案1】:

这是使用 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/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");
    }
}

【讨论】:

  • 这缺少影子
  • @dlemstra 对,很抱歉。我会尽快修复它。
  • 另外,如果你看看你的,Marge(最后一张图片)似乎和我的一样被切断了。
  • 是的,将上面的命令行转换为 C# @dlemstra
  • 伙计们,我可以帮我把它转换成 C# 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 2021-07-17
  • 2023-04-02
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多