嘿所有我想用空白圈填充该区域,但它看起来像这样:
(为了不占用这么多空间而缩小尺寸。原始尺寸:360x1200)。另请注意,我并没有真正使用blank.png文件 - 它就在那里,所以我可以检查它是否被使用。我只是制作一个普通的彩盒作为" blank.png"。
我的代码:
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");
}
}
在上面的代码中,我创建了一个白色的100x100正方形。然后我将其大小调整为100x100,并将白色背景透明为空白图像。
我得到的错误是:
&#39;宽度或高度超过限制`#FFFFFFFFFFFF&#39; @ error / cache.c / OpenPixelCache / 3491&#39;
在result.Write(@&#34; C:\ Users \ David \ Pictures \ final.png&#34;);线。
当我刚运行此代码时:
MagickImage roundImg = new MagickImage(MagickColors.White, 100, 100);
roundImg.Resize(100, 100);
roundImg.Transparent(MagickColors.White);
roundImg.Write(@"C:\Users\David\Pictures\aloneTest.png");
似乎工作得很好......
我怎样才能使这项工作成为我需要的呢?
使用的图片:
Blank.png start ----
Blank.png结束----
我希望它看起来像这样:
真的看起来像这样,因为blank.png是透明的:
宽度会有所不同,具体取决于需要插入多少个blank.png图像才能获得该宽度。上面的例子有5张图片,其中4张是空白的。
在C#中使用Bonzos示例:
roundImg.Resize(new MagickGeometry(100, 100));
roundImg.BackgroundColor = MagickColors.Transparent;
roundImg.Extent(360, 100, Gravity.West);
result = roundImg;
生成透明的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;
}
导致:
答案 0 :(得分:2)
为什么不使用透明背景的范围来增加画布大小?
我不知道c#,但在命令行中它将采用以下格式:
convert ZME5U.jpg -background transparent -gravity west -extent 800x284 result.png
答案 1 :(得分:1)
在Imagemgick命令行中,我会执行以下操作来制作圆形图像和其他4个空白图像。 (unix语法)
1) resize to exactly 100x100 (your image is not square so I forced it with !)
2) and 3) draw a black circle outline on the image
4) create a white filled circle on black background
5) put that image into the alpha channel of the first image
6) use -extent to fill out the image to 5x its width (as Bonzo suggested)
Note I use -compose over to reset the compose method for -extent
7) write the output
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 \
-compose over -background none -gravity west -extent 500x100 \
result.png
对不起,我没有在您的API中编码。但是为什么在某些情况下使用Magick.Colors和xc:在其他情况下?
您是要尝试每个空白图像还是第一个?如果所有图像都可能是您的问题,那么您的图像尺寸会超出图像尺寸。
文档说:&#34;将图像序列附加在一起,忽略透明度。&#34;
因此,使用透明图像进行粉碎并不会按照您想要的方式进行操作。
我尝试过这个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。
答案 2 :(得分:0)
我只需要创建空白圆圈图像的部分。
这是将第一张图片变成圆圈的部分:
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
抱歉,我不知道Magick.NET代码。但它只是创建一个与调整大小的maggie图像大小相同的黑白圆圈图像,并使用相当于-compose copy_opacity -composite将其放入maggie图像的alpha通道中。