C# ImageMagick根据宽度创建空白透明正方形

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

嘿,我试着用空白圆圈填充这个区域,但结果是这样的:

(缩小尺寸以避免占用太多空间。原始尺寸:360x1200)。还要注意的是,我并没有真正使用BLACK.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");
            }
        }
它似乎工作得很好

既然我也需要它,我怎么能让它工作呢

使用的图像:



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