ImageMagick 根据宽度创建空白透明正方形
ImageMagick creating blank transparent square(s) according to width
嘿,我正试图用空白圆圈填充该区域,但结果看起来像这样:
(为了不占用太多空间,缩小了尺寸。原始尺寸:360x1200)。另请注意,我并没有真正使用 blank.png 文件 - 它就在那里,所以我可以检查它是否被使用。我正在制作一个纯色框作为 "blank.png"。
我的代码:
using (MagickImageCollection images = new MagickImageCollection())
{
List<string> lFiles = new List<string>();
lFiles.Add(@"C:\Users\David\Pictures.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 并将空白图像的白色背景变为透明。
我得到的错误是:
'width or height exceeds limit `#FFFFFFFFFFFF' @ error/cache.c/OpenPixelCache/3491'
在 result.Write(@"C:\Users\David\Pictures\final.png");行。
当我只有这段代码时运行:
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开始----
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;
}
这导致:
为什么不使用透明背景的范围来增加 canvas 大小?
我不懂 c# 但在命令行中它会是这种格式:
convert ZME5U.jpg -background transparent -gravity west -extent 800x284 result.png
在 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: 呢?
您是要涂抹每张空白图片还是只涂抹第一张?如果所有图像,那么这很可能是你的问题,因为你的图像大小超出了范围。
文档说:"appends an image sequence together ignoring transparency."
所以用透明图像粉碎不能按照你想要的方式工作。
我试了 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.
但还要注意,第二个(透明图像)模糊了您的图像,从而 trim 如上所述。例如:
convert -size 100x100 xc:red xc:none +smush -35 test.png
请注意尺寸为 65x100。
I'm just needing the part where it creates the blank circle images.
这是把第一张图变成圆圈的部分:
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 通道中
嘿,我正试图用空白圆圈填充该区域,但结果看起来像这样:
(为了不占用太多空间,缩小了尺寸。原始尺寸:360x1200)。另请注意,我并没有真正使用 blank.png 文件 - 它就在那里,所以我可以检查它是否被使用。我正在制作一个纯色框作为 "blank.png"。
我的代码:
using (MagickImageCollection images = new MagickImageCollection())
{
List<string> lFiles = new List<string>();
lFiles.Add(@"C:\Users\David\Pictures.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 并将空白图像的白色背景变为透明。
我得到的错误是:
'width or height exceeds limit `#FFFFFFFFFFFF' @ error/cache.c/OpenPixelCache/3491'
在 result.Write(@"C:\Users\David\Pictures\final.png");行。
当我只有这段代码时运行:
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开始----
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;
}
这导致:
为什么不使用透明背景的范围来增加 canvas 大小?
我不懂 c# 但在命令行中它会是这种格式:
convert ZME5U.jpg -background transparent -gravity west -extent 800x284 result.png
在 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: 呢?
您是要涂抹每张空白图片还是只涂抹第一张?如果所有图像,那么这很可能是你的问题,因为你的图像大小超出了范围。
文档说:"appends an image sequence together ignoring transparency."
所以用透明图像粉碎不能按照你想要的方式工作。
我试了 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.
但还要注意,第二个(透明图像)模糊了您的图像,从而 trim 如上所述。例如:
convert -size 100x100 xc:red xc:none +smush -35 test.png
请注意尺寸为 65x100。
I'm just needing the part where it creates the blank circle images.
这是把第一张图变成圆圈的部分:
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 通道中