Применение цвета фона при аннотировании изображения текстом с помощью 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 есть полный раздел, предлагающий решения для этого:

  • Контурная этикетка

    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. Например, я попытался установить BackgroundColor перед вызовом Annotate. Это не произвело никакого эффекта:

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

Я хотел бы получить несколько советов о том, как реализовать любой метод, улучшающий читаемость текста аннотации, с помощью Magick.Net.


person user1942447    schedule 25.09.2014    source источник
comment
Вы пытались также установить StrokeColor изображения?   -  person dlemstra    schedule 25.09.2014
comment
Это был хороший совет, @dlemstra. StrokeColor добавил контур вокруг каждой буквы, и это улучшает читаемость. Однако для моего текущего приложения я предпочитаю составную метку, как показано ниже. Также спасибо за создание Magick.Net.   -  person user1942447    schedule 26.09.2014


Ответы (2)


В итоге я реализовал параметр 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: вместо имени файла. Как только это будет сделано, мы можем просто объединить сгенерированное изображение с исходным.

Помимо добавления черного фона к текстовой аннотации, этот код дает тот же результат, что и код, опубликованный в вопросе.

person user1942447    schedule 25.09.2014

Для тех, кто пытается понять, как разместить текст на изображениях.

Это похоже на код, который я использую для добавления текста к изображениям с помощью Magick.NET.

Используйте этот код как фрагмент LINQPad. Используйте пакет nuget Magick.NET-Q16-AnyCPU.

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();
    }
}

Вот результат:

введите здесь описание изображения

person hawkeyecoder    schedule 28.12.2015