标签: drawstring

如何在drawString Java中更改字体大小

如何使字体大小更大g.drawString("Hello World",10,10);

java graphics fonts awt drawstring

31
推荐指数
4
解决办法
17万
查看次数

System.Drawing - 在透明像素上使用DrawString进行错误的文本渲染

将文本渲染到位图时,我发现当在具有非不透明alpha的区域上渲染时,文本看起来非常糟糕.随着基础像素变得更加透明,问题逐渐恶化.如果我不得不猜测我会说当底层像素是透明的时,文本渲染器将任何消除锯齿的"灰色"像素绘制为纯黑色.

以下是一些截图:

在透明像素上绘制的文字:

替代文字

在半透明像素上绘制的文字:

替代文字

在不透明像素上绘制的文字:

替代文字

以下是用于呈现文本的代码:

g.SmoothingMode = SmoothingMode.HighQuality;
g.DrawString("Press the spacebar", Font, Brushes.Black, textLeft, textTop);
Run Code Online (Sandbox Code Playgroud)

c# system.drawing gdi+ drawstring winforms

30
推荐指数
3
解决办法
2万
查看次数

使用自定义TTF字体进行DrawString图像渲染

我在服务器端使用GDI +创建一个流式传输到用户浏览器的图像.没有标准字体符合我的要求,因此我想加载TrueType字体并使用此字体将我的字符串绘制到图形对象:

using (var backgroundImage = new Bitmap(backgroundPath))
using (var avatarImage = new Bitmap(avatarPath))
using (var myFont = new Font("myCustom", 8f))
{
    Graphics canvas = Graphics.FromImage(backgroundImage);
    canvas.DrawImage(avatarImage, new Point(0, 0));

    canvas.DrawString(username, myFont,
        new SolidBrush(Color.Black), new PointF(5, 5));

    return new Bitmap(backgroundImage);
}
Run Code Online (Sandbox Code Playgroud)

myCustom 表示未安装在服务器上但我有TTF文件的字体.

如何加载TTF文件以便我可以在GDI +字符串渲染中使用它?

.net c# fonts gdi+ drawstring

19
推荐指数
2
解决办法
1万
查看次数

MeasureString()填充左侧和右侧的文本

我在C++中使用GDI +.(此问题也可能存在于C#中).

我注意到每当我调用Graphics :: MeasureString()或Graphics :: DrawString()时,字符串都会在左侧和右侧填充空格.

例如,如果我使用Courier字体(不是斜体!)而我测量"P"我得到90,但"PP"给我150.我希望等宽字体给出"PP"的两倍宽度.

我的问题是:这是有意或记录的行为,我该如何禁用它?

RectF Rect(0,0,32767,32767);
RectF Bounds1, Bounds2;
graphics->MeasureString(L"PP", 1, font, Rect, &Bounds1);
graphics->MeasureString(L"PP", 2, font, Rect, &Bounds2);
margin = Bounds1.Width * 2 - Bounds2.Width;
Run Code Online (Sandbox Code Playgroud)

gdi+ drawstring

17
推荐指数
3
解决办法
1万
查看次数

在.NET中绘制文本

我正在做一些关于在.Net中绘制文本的测试,我得到了以下结果.

绘图文本示例

所有情况都使用默认的Windows Vista/7字体:Segoe UI,9

如您所见,第二个字符串与其他字符串之间存在差异(质量较差,反别名不同).我试图在对象中配置反别名和平滑模式Graphics,没有任何结果.

是否可以绘制文本,Graphics.DrawString并获得与其他方法相同的质量?

提前致谢.


编辑:我已经使用Reflector审查了代码.我意识到Graphics.DrawString使用gdiplus.dll调用方法GdipDrawString()并TextRenderer.DrawText使用user32.dll调用DrawTextExWDrawTextExA.

有什么评论吗?

.net c# drawing gdi+ drawstring

16
推荐指数
2
解决办法
2万
查看次数

如何对齐SpriteBatch.DrawString绘制的文本?

有没有一种简单的方法可以将文本对齐到右边和中心(而不是默认左边)?

c# xna text drawstring alignment

13
推荐指数
2
解决办法
1万
查看次数

Monogame使用Graphics.DrawString(而不是SpriteBatch.DrawString)渲染文本

使用Graphics.DrawString将一组(相当静态的)文本渲染到屏幕外位图,将其转换为Texture2D一次,然后简单地调用SpriteBatch.Draw,而不是使用内容管道并使用渲染文本,是否有任何缺点SpriteFont?这基本上是一页文本,绘制成"纸张",但用户也可以选择调整字体大小,这意味着我必须包含不同大小的spritefonts.

由于这是一个仅限Windows的应用程序(不打算移植它),我可以访问所有字体,例如普通的WinForms应用程序,我相信使用Graphics.DrawString(甚至TextRenderer)使用精灵字体时渲染质量会好得多.

此外,似乎性能可能更好,因为SpriteBatch.DrawString需要在每次迭代中"渲染"整个文本(即分别为每个字母发送顶点),而使用位图我只做一次,所以它应该稍微减少工作量CPU方面.

  1. 我没有看到任何问题或缺点吗?
  2. 是否可以使用spritefonts获得alpha混合文本?我已经看过周围提到的Nuclex框架,但它并没有被移植到Monogame AFAIK.

[更新]

从技术方面来看,它似乎比通过精灵字体更好地完成文本渲染.如果它们是水平渲染的,我甚至会得到ClearType.可能存在的一个问题是字体的spritesheets(可能是?)在纹理内存方面比为文本页面创建单独的纹理更有效.

drawstring monogame spritefont spritebatch

13
推荐指数
1
解决办法
2665
查看次数

在矩形内填充文本

我正在使用GDI +在Graphics对象上绘制一个字符串.

我希望字符串适合预定义的矩形(不破坏任何行)

除了在循环中使用TextRenderer.MeasureString()之外,还有什么做到这一点,直到返回所需的大小?

就像是:

DrawScaledString(Graphics g, string myString, Rectangle rect)
Run Code Online (Sandbox Code Playgroud)

.net graphics gdi+ drawstring

12
推荐指数
2
解决办法
1万
查看次数

Java - 如何在矩形中以可视方式居中特定字符串(而不仅仅是字体)

我试图在JPanel上以视觉方式居中用户提供的任意字符串.我已经在SO上阅读了几十个其他类似的问题和答案,但没有发现任何直接解决我遇到的问题.

在下面的代码示例中,getWidth()和getHeight()引用我放置文本字符串的JPanel的宽度和高度.我发现TextLayout.getBounds()非常好地告诉我包含文本的边界矩形的大小.因此,我认为通过计算文本边界矩形左下角的JPanel上的x和y位置,将文本矩形居中在JPanel矩形中会相对简单:

FontRenderContext context = g2d.getFontRenderContext();
messageTextFont = new Font("Arial", Font.BOLD, fontSize);
TextLayout txt = new TextLayout(messageText, messageTextFont, context);
Rectangle2D bounds = txt.getBounds();
xString = (int)((getWidth() - (int)bounds.getWidth()) / 2 );
yString = (int)((getHeight()/2) + (int)(bounds.getHeight()/2));

g2d.setFont(messageTextFont);
g2d.setColor(rxColor);
g2d.drawString(messageText, xString, yString);
Run Code Online (Sandbox Code Playgroud)

这适用于全部大写的字符串.但是,当我开始使用带有下行字符的小写字母(如g,p,y)进行测试时,文本不再居中.小写字母上的下延(在字体基线下方延伸的部分)在JPanel上绘制得太低,使文本看起来居中.

那时我发现(感谢SO)传递给drawString()的y参数指定了绘制文本的基线,而不是下限.因此,再次在SO的帮助下,我意识到我需要通过字符串中下划线的长度来调整文本的位置:

....
    TextLayout txt = new TextLayout(messageText, messageTextFont, context);
    Rectangle2D bounds = txt.getBounds();
    int descent = (int)txt.getDescent();
    xString = (int)((getWidth() - (int)bounds.getWidth()) / 2 );
    yString = (int)((getHeight()/2) + (int)(bounds.getHeight()/2) - descent); …
Run Code Online (Sandbox Code Playgroud)

java string swing drawstring

12
推荐指数
2
解决办法
9324
查看次数

为什么DrawString看起来如此糟糕?

我正在尝试为彩色图像添加文本比例.agcScale.jpg图像(下方)是顶部和底部的2个winform标签,左侧和右侧是2个winform图片框.完全相同的代码用于在右侧和左侧图片框中生成字符串,唯一的区别是pictureBoxAgcVscale仅包含字符串.为什么pictureBoxAgc中的DrawString看起来不错,但pictureBoxAgcVscale中的DrawString看起来如此糟糕?我可以通过为每个像素执行bmp.SetPixel来修复pictureBoxAgcVscale,但这似乎是解决此问题的错误方法.

agcScale.jpg

private void DisplayAgcVscale(double min, double max)
{
    var bmp = new Bitmap(pictureBoxAgcVscale.Width, pictureBoxAgcVscale.Height);
    var c = (max - min) / bmp.Height;
    using (var g = Graphics.FromImage(bmp))
    {
        var font = new Font("Microsoft Sans Serif", 8.25F);
        var y1 = bmp.Height / 10;
        for (var y = y1; y < bmp.Height; y += y1)
        {
            var agc = y * c + min;
            var text = agc.ToString("#0.000V");
            var h = bmp.Height - y - font.Height / 2;
            g.DrawString(text, font, Brushes.Black, 0, …
Run Code Online (Sandbox Code Playgroud)

c# drawstring picturebox winforms

10
推荐指数
1
解决办法
4053
查看次数