使用Magick.Net在使用文本注释图像时应用背景颜色

时间:2014-09-25 12:59:07

标签: c# imagemagick magick.net

我正在使用C#和Magick.Net来注释图像,如下所示:

var text = "Variable text";
var img = new MagickImage("image.jpg");
img.FontPointsize = 50;
img.FillColor = new MagickColor(Color.White);
img.Annotate(text, Gravity.Northwest);

注释有效,但文字并不总是易于阅读,因为它可以与图像混合。

ImageMagick手册有full section suggesting solutions for this

  • 概述标签

    convert dragon.gif -gravity south \
      -stroke '#000C' -strokewidth 2 -annotate 0 'Faerie Dragon' \
      -stroke  none   -fill white    -annotate 0 'Faerie Dragon' \
      anno_outline.jpg
    
  • 绘制Dim Box

    convert dragon.gif \
      -fill '#0008' -draw 'rectangle 5,128,114,145' \
      -fill white   -annotate +10+141 'Faerie Dragon' \
      anno_dim_draw.jpg
    

(我只有在没有其他工作的情况下才使用此方法,因为它需要明确定义矩形宽度和高度。)

  • Undercolor Box

    convert dragon.gif  -fill white  -undercolor '#00000080'  -gravity South \
      -annotate +0+5 ' Faerie Dragon '     anno_undercolor.jpg
    
  • 合成标签

    convert -background '#00000080' -fill white label:'Faerie Dragon' miff:- |\
          composite -gravity south -geometry +0+3 \
          -   dragon.gif   anno_composite.jpg
    
  • 自动调整大小的标题

    width=`identify -format %w dragon.gif`; \
    convert -background '#0008' -fill white -gravity center -size ${width}x30 \
      caption:"Faerie Dragons love hot apple pies\!" \
      dragon.gif +swap -gravity south -composite  anno_caption.jpg
    
  • 花式标签

    convert -size 100x14 xc:none -gravity center \
      -stroke black -strokewidth 2 -annotate 0 'Faerie Dragon' \
      -background none -shadow 100x3+0+0 +repage \
      -stroke none -fill white     -annotate 0 'Faerie Dragon' \
      dragon.gif  +swap -gravity south -geometry +0-3 \
      -composite  anno_fancy.jpg
    

上述任何一种方法对我都没问题。但是,我似乎无法在.Net API中找到所需的功能。例如,我在调用Annotate之前尝试设置BackgroundColor。这没有产生任何影响:

img.BackgroundColor = new MagickColor(Color.Black);

我想了解如何使用Magick.Net实现任何增强注释文本可读性的方法。

2 个答案:

答案 0 :(得分:3)

我最终实现了 Composited Label 选项,如下所示:

var text = "Variable text";
var img = new MagickImage("image.jpg");

using (var imgText = new MagickImage())
{
     imgText.FontPointsize = 50;
     imgText.BackgroundColor = new MagickColor(Color.Black);
     imgText.FillColor = new MagickColor(Color.White);
     imgText.Read("label:" + text);
     img.Composite(text, Gravity.Northwest);
}

诀窍是阅读'图像,但提供label:符号代替文件名。完成后,我们可以将生成的图像与原始图像组合在一起。

除了在文本注释中添加黑色背景外,此代码产生的结果与问题中发布的结果相同。

答案 1 :(得分:1)

其他任何人试图找出如何在图像上放置文字。

这类似于我用Magick.NET向图像添加文本的代码。

将此代码用作LINQPad代码段。使用Magick.NET-Q16-AnyCPU nuget包。

void Main()
{
    TextRender();
}

public void TextRender()
{
    //If you use a transparent color here, you won't see the text
    var imageBackgroundColor = new MagickColor("White");

    using (MagickImage image = new MagickImage(imageBackgroundColor, 400, 400))
    {
        var drawable = new DrawableText(0,10,"Line One\nLine Two\nLine Three");
        var gravity = new DrawableGravity(Gravity.North);
        var font = new DrawableFont("Arial");
        var antialias = new DrawableTextAntialias(true);
        var size = new DrawablePointSize(50);
        var color = new DrawableFillColor(Color.Black);
        //If needed
        //var strokeColor = new DrawableStrokeColor(Color.White);

        image.Annotate("Some annotation", Gravity.Center);

        image.Draw(drawable, gravity, font, antialias, size, color);//, strokeColor);

        var imageFileName = @"c:\temp\tempImage.jpg";

        //Write the file to disk
        image.Write(imageFileName);

        //For use in linqpad only
        //Load the written file from disk and show it in the Results window
        var image2 = (Bitmap) Image.FromFile(imageFileName, true);
        image2.Dump();
    }
}

结果如下:

enter image description here