winforms 图像上具有不同颜色的文本

3j86kqsm  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(150)

我试图在图像上绘制文本,其中一些单词必须用不同的颜色突出显示。我在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);

在这两种情况下,调整大小的图像的大小和分辨率是相同的。但我不知道在使用中间图像创建图形对象后,显式绘制调整大小的图像时,是什么使它工作。请告诉我,如果你知道是什么可能造成了差异。
谢谢你的回答。

yruzcnhs

yruzcnhs1#

我认为您需要使用同一组方法来测量文本和绘制文本。

var size = TextRenderer.MeasureText(word, font) ;
...
TextRenderer.DrawText(g, word, font, ...);

var ranges = g.MeasureCharacterRanges(word, font, rect, format);
...
g.DrawString(word, font, ...);

您可以阅读有关TextRenderer.DrawTextGraphics.DrawStringhere之间的差异的文章,我不希望Graphics.MeasureCharacterRangesTextRenderer.DrawText兼容,至少不是在所有用例中。

相关问题