ImageMagick根据宽度

时间:2018-03-24 06:23:35

标签: c# imagemagick imagick imagemagick-convert

嘿所有我想用空白圈填充该区域,但它看起来像这样:

(为了不占用这么多空间而缩小尺寸。原始尺寸:360x1200)。另请注意,我并没有真正使用blank.png文件 - 它就在那里,所以我可以检查它是否被使用。我只是制作一个普通的彩盒作为" blank.png"。

enter image description here

我的代码:

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");

似乎工作得很好......

enter image description here

我怎样才能使这项工作成为我需要的呢?

使用的图片:

enter image description here

Blank.png start ----

enter image description here

Blank.png结束----

我希望它看起来像这样:

enter image description here

真的看起来像这样,因为blank.png是透明的:

enter image description here

宽度会有所不同,具体取决于需要插入多少个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;
 }

导致:

enter image description here

3 个答案:

答案 0 :(得分:2)

为什么不使用透明背景的范围来增加画布大小?

我不知道c#,但在命令行中它将采用以下格式:

convert ZME5U.jpg -background transparent -gravity west -extent 800x284 result.png

Extended canvas

答案 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

enter image description here


对不起,我没有在您的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

enter image description here

请注意,尺寸为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

enter image description here

如果您只想要外部透明且没有黑色圆圈的圆圈,那么

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

enter image description here

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

enter image description here

抱歉,我不知道Magick.NET代码。但它只是创建一个与调整大小的maggie图像大小相同的黑白圆圈图像,并使用相当于-compose copy_opacity -composite将其放入maggie图像的alpha通道中。