【问题标题】:ImageMagick.net Background colour of annotated text/label always blackImageMagick.net 带注释文本/标签的背景颜色始终为黑色
【发布时间】:2019-08-13 11:28:23
【问题描述】:

我正在尝试向现有图像添加标签/注释文本(文本的背景颜色是透明的)。

我尝试了几种不同的方法,但我总是得到黑色背景色。

如果有人能指出我正确的方向,我将不胜感激。

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

两种尝试都生成了具有黑色背景的相同图像(在图像中添加文本的区域)

.

【问题讨论】:

    标签: imagemagick magick.net imagemagick.net


    【解决方案1】:

    您的第一种方法可能是最简单的方法。但是您应该改用以下重载:img.Composite(imgText, Gravity.South, CompositeOperator.Over); 默认为 CompositeOperator.In,这不是您应该使用的将标签作为叠加层的方法。

    【讨论】:

      【解决方案2】:

      在 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
      


      补充:

      如果你只想要文字,那就省去背景颜色,只写文字。

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


      【讨论】:

      • 在您的示例图像中,带注释的文本具有白色背景。你如何使白色背景透明?这就是我要问的。谢谢
      • 白色来自堆栈溢出页面的颜色。它真的很透明,白色透出来。从堆栈溢出中提取PNG图像并在某些查看器中打开,您会看到它是透明的
      • 好的我明白你的意思,但我想要的是基础图像的浅灰色可见(不是 SO 的白色),只是为了重新迭代,我有很多图像想应用一些文本,我只希望放置文本并保留基础层。希望我解释得对。
      • 在我的回答中查看我上面的补充。
      猜你喜欢
      • 1970-01-01
      • 2015-06-11
      • 2018-03-14
      • 2010-11-22
      • 1970-01-01
      • 2020-12-26
      • 2020-10-28
      • 2021-12-03
      • 1970-01-01
      相关资源
      最近更新 更多