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 通道中