gpt4 book ai didi

c# - 如何将弯曲的文本渲染成位图?

转载 作者:太空狗 更新时间:2023-10-29 23:59:28 25 4
gpt4 key购买 nike

我目前正在动态创建位图并使用位图中的图形对象在其上绘制字符串,如下所示:

System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(bmp);
graph.DrawString(text, font, brush, new System.Drawing.Point(0, 0));

这将返回一个矩形位图,其中字符串从左到右垂直书写。我也希望能够把绳子画成彩虹的形状。我怎样才能做到这一点?

最佳答案

我最近遇到了这个问题(我正在渲染用于打印到 CD 上的文本),所以这是我的解决方案:

private void DrawCurvedText(Graphics graphics, string text, Point centre, float distanceFromCentreToBaseOfText, float radiansToTextCentre, Font font, Brush brush)
{
// Circumference for use later
var circleCircumference = (float)(Math.PI * 2 * distanceFromCentreToBaseOfText);

// Get the width of each character
var characterWidths = GetCharacterWidths(graphics, text, font).ToArray();

// The overall height of the string
var characterHeight = graphics.MeasureString(text, font).Height;

var textLength = characterWidths.Sum();

// The string length above is the arc length we'll use for rendering the string. Work out the starting angle required to
// centre the text across the radiansToTextCentre.
float fractionOfCircumference = textLength / circleCircumference;

float currentCharacterRadians = radiansToTextCentre + (float)(Math.PI * fractionOfCircumference);

for (int characterIndex = 0; characterIndex < text.Length; characterIndex++)
{
char @char = text[characterIndex];

// Polar to cartesian
float x = (float)(distanceFromCentreToBaseOfText * Math.Sin(currentCharacterRadians));
float y = -(float)(distanceFromCentreToBaseOfText * Math.Cos(currentCharacterRadians));

using (GraphicsPath characterPath = new GraphicsPath())
{
characterPath.AddString(@char.ToString(), font.FontFamily, (int)font.Style, font.Size, Point.Empty,
StringFormat.GenericTypographic);

var pathBounds = characterPath.GetBounds();

// Transformation matrix to move the character to the correct location.
// Note that all actions on the Matrix class are prepended, so we apply them in reverse.
var transform = new Matrix();

// Translate to the final position
transform.Translate(centre.X + x, centre.Y + y);

// Rotate the character
var rotationAngleDegrees = currentCharacterRadians * 180F / (float)Math.PI - 180F;
transform.Rotate(rotationAngleDegrees);

// Translate the character so the centre of its base is over the origin
transform.Translate(-pathBounds.Width / 2F, -characterHeight);

characterPath.Transform(transform);

// Draw the character
graphics.FillPath(brush, characterPath);
}

if (characterIndex != text.Length - 1)
{
// Move "currentCharacterRadians" on to the next character
var distanceToNextChar = (characterWidths[characterIndex] + characterWidths[characterIndex + 1]) / 2F;
float charFractionOfCircumference = distanceToNextChar / circleCircumference;
currentCharacterRadians -= charFractionOfCircumference * (float)(2F * Math.PI);
}
}
}

private IEnumerable<float> GetCharacterWidths(Graphics graphics, string text, Font font)
{
// The length of a space. Necessary because a space measured using StringFormat.GenericTypographic has no width.
// We can't use StringFormat.GenericDefault for the characters themselves, as it adds unwanted spacing.
var spaceLength = graphics.MeasureString(" ", font, Point.Empty, StringFormat.GenericDefault).Width;

return text.Select(c => c == ' ' ? spaceLength : graphics.MeasureString(c.ToString(), font, Point.Empty, StringFormat.GenericTypographic).Width);
}

screenshot of curved text in program output

关于c# - 如何将弯曲的文本渲染成位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2803853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com