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