我正在使用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实现任何增强注释文本可读性的方法。
答案 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();
}
}
结果如下: