ImageMagick.net Цвет фона аннотированного текста / надписи всегда черный - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь добавить текст метки / аннотации (где цвет фона текста прозрачен) к существующему изображению.

Я пробовал несколько разных подходов, но я продолжаю получать черный фонцвет.

Если бы кто-нибудь мог указать мне правильное направление, я был бы очень признателен.

Попытка 1:

using (var images = new MagickImageCollection())
using (var img = new MagickImage(imgBytes))
{
    img.Resize(imageDto.Width, imageDto.Height);

    using (var imgText = new MagickImage(MagickColors.None, imageDto.Width, imageDto.Height))
    {
        var labelSettings = new MagickReadSettings()
        {
            BackgroundColor = MagickColors.None,
            Font = "Arial",
            FontPointsize = imageDto.FontSize,
            FillColor = MagickColors.Blue,
            BorderColor = MagickColors.None,
        };

        imgText.Read("label:" + imageDto.WatermarkText, labelSettings);
        img.Composite(imgText, Gravity.South);


        img.Write($"{Guid.NewGuid().ToString()}.png");
        return img.ToBase64();

    }
}

Попытка 2:

using (var img = new MagickImage(imgBytes))
{
    img.Resize(imageDto.Width, imageDto.Height);

    // Load the original image and add it to the collection.
    images.Add(img);

    // Text label watermark settings
    var labelSettings = new MagickReadSettings()
    {
        BackgroundColor = new MagickColor(MagickColors.Transparent),
        Font = "Arial",
        FontPointsize = imageDto.FontSize,
        FillColor = MagickColors.Blue
    };

    // Create the label image.
    var label = new MagickImage($"label:{imageDto.WatermarkText}", labelSettings);

    // Extent the width of the label to match the width of the original image.
    label.Extent(img.Width, 0, Gravity.Center);
    label.Transparent(MagickColors.Black);

    // Add the label to the collection.
    images.Add(label);

    // Append the images to create the output image.
    using (var result = images.AppendVertically())
    {
        result.Write($"{Guid.NewGuid().ToString()}.png");
        return result.ToBase64();
    }
}

Обе попытки дают одно и то же изображение с черным фоном (в области, где текст был добавлен к изображению)

Black BG on added text.

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Ваш первый подход, вероятно, самый простой. Но вместо этого вы должны использовать следующую перегрузку: img.Composite(imgText, Gravity.South, CompositeOperator.Over); По умолчанию CompositeOperator.In, и это не то, что вы должны использовать, чтобы получить метку в качестве наложения.

1 голос
/ 22 марта 2019

В ImageMagick нельзя рисовать прозрачность для текста или фона на непрозрачном изображении.Поэтому вам нужно нарисовать цветной (черный) прямоугольник, затем залить его прозрачностью, а затем нарисовать цветной текст на прозрачном изображении.Например, с вашим изображением:

convert image.png \
-draw "translate 250,250 fill black rectangle -50,-50 50,50 \
fill none matte 0,0 floodfill" \
-fill "rgba(255,0,0,1)" -pointsize 20 \
-gravity center -annotate +0+0 "TESTING" \
result.png


enter image description here

ДОПОЛНЕНИЕ:

Если вам нужен только текст, оставьтеВыделите цвет фона и просто напишите текст.

convert image.png \
-fill "red" -pointsize 20 \
-gravity center -annotate +0+0 "TESTING" \
result.png


enter image description here

...