我试图在图像上绘制文本,其中一些单词必须用不同的颜色突出显示。我在SO中找到了一个解决方案,使用TextRenderer。DrawText和MeasureCharacterRanges来分割字符串中的单词,如果单词与关键字匹配,则用不同的颜色单独呈现它们。
private void AddText1(string txt, Graphics g, Rectangle rect)
{
TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter |
TextFormatFlags.NoPadding | TextFormatFlags.NoClipping;
using (StringFormat format = new StringFormat())
{
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
MatchCollection mc = Regex.Matches(txt, @"[^\s]+");
CharacterRange[] ranges = mc.Cast<Match>().Select(m => new CharacterRange(m.Index, m.Length)).ToArray();
format.SetMeasurableCharacterRanges(ranges);
using (Font font = new Font("Times New Roman", 40, FontStyle.Regular, GraphicsUnit.Point))
{
Region[] regions = g.MeasureCharacterRanges(txt, font, rect, format);
for (int i = 0; i < ranges.Length; i++)
{
Rectangle WordBounds = Rectangle.Round(regions[i].GetBounds(g));
string word = txt.Substring(ranges[i].First, ranges[i].Length);
if (word == "keyword")
TextRenderer.DrawText(g, word, font, WordBounds, Color.YellowGreen, flags);
else
TextRenderer.DrawText(g, word, font, WordBounds, Color.White, flags);
}
}
}
}
当我在屏幕上呈现位图和文本时(直接呈现给绘画事件中的窗体),这段代码工作得很好。
但是当我使用图像中的图形对象时,为了将其保存到文件中,我从MeasureCharacterRanges中获得了完全不同的边框,在保存的图像中具有完全扭曲的文本位置。
我不确定这是MeasureCharacterRanges方法中的一个bug还是我遗漏了一些东西。如果没有解决方案或变通方法,我愿意考虑其他解决方案。
编辑:问题似乎来自其他地方,我有这样的伪代码。
Image imgResize = resizeImage(strfile);
Graphics g = Graphics.FromImage(imgResize);
AddText1(strText, g, rect);
这行不通但当我成功时
Image imgResize = resizeImage(strfile);
Image img2 = new Bitmap(width, height);
Graphics g = Graphics.FromImage(img2);
g.DrawImage(imgResize, new Rectangle(0, 0, width, height));
AddText1(strText, g, rect);
在这两种情况下,调整大小的图像的大小和分辨率是相同的。但我不知道在使用中间图像创建图形对象后,显式绘制调整大小的图像时,是什么使它工作。请告诉我,如果你知道是什么可能造成了差异。
谢谢你的回答。
1条答案
按热度按时间yruzcnhs1#
我认为您需要使用同一组方法来测量文本和绘制文本。
或
您可以阅读有关
TextRenderer.DrawText
和Graphics.DrawString
here之间的差异的文章,我不希望Graphics.MeasureCharacterRanges
与TextRenderer.DrawText
兼容,至少不是在所有用例中。