C# ImageMagick根据宽度创建空白透明正方形
嘿,我试着用空白圆圈填充这个区域,但结果是这样的: (缩小尺寸以避免占用太多空间。原始尺寸:360x1200)。还要注意的是,我并没有真正使用BLACK.PNG文件——它只是在那里,所以我可以检查它是否被使用。我只是制作了一个简单的颜色框作为“blank.png” 我的代码:C# ImageMagick根据宽度创建空白透明正方形,c#,imagemagick,imagick,imagemagick-convert,C#,Imagemagick,Imagick,Imagemagick Convert,嘿,我试着用空白圆圈填充这个区域,但结果是这样的: (缩小尺寸以避免占用太多空间。原始尺寸:360x1200)。还要注意的是,我并没有真正使用BLACK.PNG文件——它只是在那里,所以我可以检查它是否被使用。我只是制作了一个简单的颜色框作为“blank.png” 我的代码: using (MagickImageCollection images = new MagickImageCollection()) { List<string> lF
using (MagickImageCollection images = new MagickImageCollection())
{
List<string> lFiles = new List<string>();
lFiles.Add(@"C:\Users\David\Pictures\1.jpg");
lFiles.Add(@"C:\Users\David\Pictures\blank.png");
lFiles.Add(@"C:\Users\David\Pictures\blank.png");
lFiles.Add(@"C:\Users\David\Pictures\blank.png");
lFiles.Add(@"C:\Users\David\Pictures\blank.png");
IMagickImage roundImg = new MagickImage();
IMagickImage mask = new MagickImage();
IMagickImage shadow = new MagickImage();
IMagickImage result = new MagickImage();
bool isBlankImage = false;
foreach (string tempFBProfileImg in lFiles)
{
roundImg = new MagickImage(tempFBProfileImg);
if (Regex.IsMatch(@"C:\Users\David\Pictures\blank.png", @"\bblank.png\b"))
{
roundImg = new MagickImage(MagickColors.White, 100, 100);
roundImg.Resize(100, 100);
roundImg.Transparent(MagickColors.White);
}
else
{
mask = new MagickImage("xc:black", 100, 100);
mask.Settings.FillColor = MagickColors.White;
mask.Draw(new DrawableCircle(50, 50, 50, 90));
mask.HasAlpha = false;
roundImg.Resize(100, 100);
roundImg.Composite(mask, CompositeOperator.CopyAlpha);
roundImg.Draw(
new DrawableStrokeColor(MagickColors.Black),
new DrawableStrokeWidth(1),
new DrawableFillColor(MagickColors.None),
new DrawableCircle(50, 50, 50, 90)
);
shadow = new MagickImage("xc:none", 100, 100);
shadow.Settings.FillColor = MagickColors.Black;
shadow.Draw(new DrawableCircle(50, 50, 50, 90));
shadow.Blur(0, 5);
roundImg.Composite(shadow, CompositeOperator.DstOver);
}
images.Add(roundImg);
images.First().BackgroundColor = MagickColors.None;
result = images.SmushHorizontal(-35);
result.Resize(360, 0);
result.Write(@"C:\Users\David\Pictures\final.png");
}
}
它似乎工作得很好
既然我也需要它,我怎么能让它工作呢
使用的图像:
Blank.png开始---- Blank.png结束---- 我希望它看起来像这样: 实际上是这样的,因为blank.png是透明的: 宽度会有所不同,具体取决于需要插入多少blank.png图像才能获得该宽度。上面的例子有5个图像,其中4个是空白图像。 在C#中使用Bonzos示例: 只生成一个透明的360x100图像 fmw42:
mask = new MagickImage("xc:black", 100, 100);
mask.Settings.FillColor = MagickColors.White;
mask.Draw(new DrawableCircle(50, 50, 50, 100));
mask.HasAlpha = false;
mask.Resize(100, 100);
roundImg.Composite(mask, CompositeOperator.CopyAlpha);
可能的解决方案
if (Regex.IsMatch(tempFBProfileImg.ToLower(), @"\bblank.png\b"))
{
result.Extent(360, 100, Gravity.West);
images.Add(result);
break;
}
其结果是:
为什么不使用透明背景的区段来增加画布的大小 我不知道c#,但在命令行中,它将采用以下格式:
convert ZME5U.jpg -background transparent -gravity west -extent 800x284 result.png
在Imagemgick命令行中,我将执行以下操作以生成圆形图像和其他4个空白图像。(unix语法)
对不起,我没有在你的API中编码。但为什么在某些情况下使用Magick.Colors,而在其他情况下使用xc: 你是想弄脏每一张空白图片还是第一张?如果所有的图片都是,那么这很可能是你的问题,因为你正在弄脏你的图片大小 文档中说:“忽略透明度,将图像序列附加在一起。” 因此,使用透明图像进行粉碎并不是您想要的方式 我试了3次,它运行了,但失败了4次
convert -size 100x100 xc:none xc:none xc:none -smush -35+0 x.png
convert -size 100x100 xc:none xc:none xc:none xc:none -smush -35+0 x.png
convert: width or height exceeds limit `x.png' @ error/cache.c/OpenPixelCache/3906.
convert: memory allocation failed `x.png' @ error/png.c/WriteOnePNGImage/9067.
convert: Invalid image height in IHDR `x.png' @ warning/png.c/MagickPNGWarningHandler/1665.
convert: Image height exceeds user limit in IHDR `x.png' @ warning/png.c/MagickPNGWarningHandler/1665.
convert: Invalid IHDR data `x.png' @ error/png.c/MagickPNGErrorHandler/1639.
但也要注意,第二个(透明图像)会涂抹在图像上,以便如上所述对其进行修剪。例如:
convert -size 100x100 xc:red xc:none +smush -35 test.png
请注意,尺寸为65x100
我只需要创建空白圆图像的部分。 这是使第一个图像成为圆形的部分:
convert maggie.jpg -resize 100x100! \
-fill none -stroke black -strokewidth 1 \
-draw "circle 50,50 50,99" -alpha off \
\( -size 100x100 xc:black -fill white -draw "circle 50,50 50,100" \) \
-alpha off -compose copy_opacity -composite \
result.png
如果您只想要外部透明的圆,而不想要黑色的圆,那么
convert maggie.jpg -resize 100x100! \
\( -size 100x100 xc:black -fill white -draw "circle 50,50 50,100" \) \
-alpha off -compose copy_opacity -composite \
result.png
或
对不起,我不知道Magick.NET代码。但它只是创建了一个黑白大小的圆形图像,大小与调整后的麦琪图像大小相同,并将其放在麦琪图像的alpha通道中,使用了相当于合成拷贝的透明度。我只需要在其中创建空白圆图像的部分。我有生成图像的代码,这些图像实际上是我的示例1.jpg(maggie)中的图像。在我的逻辑中,我检查当前图像应该是图像还是空白图像。是的,我无法用C#复制此图像,因此我希望@dlemstra能再次帮助我。你认为你可以从dlemstra获得C#转换版本吗?我给他发了一条信息,但还没有回复我。给我们看看你的代码,就可以做这个循环。看看你是否能在不使用所有其他代码的情况下完成这项工作。你的新结果看起来不错。问题是什么?请更新您的问题。抱歉,您需要从懂Magick.Net的人那里获取hep。我只能为您提供正确的Imagemagick命令行解决方案。
convert -size 100x100 xc:red xc:none +smush -35 test.png
convert maggie.jpg -resize 100x100! \
-fill none -stroke black -strokewidth 1 \
-draw "circle 50,50 50,99" -alpha off \
\( -size 100x100 xc:black -fill white -draw "circle 50,50 50,100" \) \
-alpha off -compose copy_opacity -composite \
result.png
convert maggie.jpg -resize 100x100! \
\( -size 100x100 xc:black -fill white -draw "circle 50,50 50,100" \) \
-alpha off -compose copy_opacity -composite \
result.png
convert maggie.jpg -resize 100x100! \
\( +clone -fill black -colorize 100 -fill white -draw "circle 50,50 50,100" \) \
-alpha off -compose copy_opacity -composite \
result.png