2

我正在使用 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 手册有一个完整的部分建议解决方案

  • 概述标签

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

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

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

  • 底色框

    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 实现任何增强注释文本可读性的方法的指示。

4

3 回答 3

4

我最终实现了复合标签选项,如下所示:

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:符号代替文件名。完成后,我们可以将生成的图像与原始图像结合起来。

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

于 2014-09-25T14:45:33.833 回答
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();
    }
}

这是结果:

在此处输入图像描述

于 2015-12-28T19:21:12.803 回答
1

只是另一种方式,类似于@user1942447

string textToAdd = "ultra wide text with /r/n multiline row";

var readSettings = new MagickReadSettings
{
    Font = "Arial",
    TextGravity = Gravity.Center,
    BackgroundColor = MagickColors.Transparent,
    Height = 200, // height of text box
    Width = 300 // width of text box
};

using (var tImage = new MagickImage())
{
    using (var caption = new MagickImage($"label:{textToAdd}", readSettings))
    {
        //image is your main image where you need to put text
        image.Composite(caption, 10, 20, CompositeOperator.Over);    
        image.Write(AppContext.BaseDirectory + Guid.NewGuid() + ".png");
    }
}

文本将根据文本框大小自动调整大小。如果您需要严格的字体大小,请使用 FontPointsize 属性,但文本可能会超出边框。

于 2021-12-29T18:45:18.120 回答