3

私はこれをやろうとしてきましたが、何らかの理由でこれは私に奇妙な結果をもたらしています:

int bpp = Screen.PrimaryScreen.BitsPerPixel;
string fontName = "Tahoma";
Font font = new Font(fontName, 10 * bpp, GraphicsUnit.Point);
Bitmap bm = new Bitmap(20 * bpp, 20 * bpp);
Graphics g = Graphics.FromImage(bm);
TextRenderer.DrawText(g, "a", font, new Rectangle(0, 0, 5 * bpp, 6 * bpp), Color.Black);
g.Flush();
pictureBox1.Image = bm;

ここで何が間違っていますか?写真には何も印刷されていません。すべての bpp 参照を削除すると、それを見ることができますが、かなり小さいです。

4

3 に答える 3

5

BitsPerPixelは色深度 (ピクセルの色を表すために使用されるメモリ ビットの数) を表し、解像度とは何の関係もないことを認識していますか?

あなたがしたいことは、解像度に関連するサイズでテキストを描画することだと思います。これは、オブジェクトのDpiXおよびDpiYプロパティを参照することで実行できます。Graphics

アップデート

この計算に Dpi を含める必要があるかどうかはわかりません。必要なのは、テキストの目的のサイズを定義する Rectangle を作成し、正しいフォント サイズを計算して、テキストが四角形内に収まるようにすることだけです。以下はそれを行います(ただし、垂直方向と水平方向の両方のテキストサイズを最大化します)。問題を解決するためのヒントが得られる場合があります。

Bitmap bm = new Bitmap(50, 50);
using (Font font = new Font(fontName, 10, GraphicsUnit.Point))
using (Graphics g = Graphics.FromImage(bm))
{
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    StringFormat stringFormat = new StringFormat()
    {
        Alignment = StringAlignment.Center,
        LineAlignment = StringAlignment.Near
    };
    Rectangle rect = new Rectangle(0, 0, bm.Width, bm.Height);
    // measure how large the text is on the Graphics object with the current font size
    SizeF s = g.MeasureString(text, font);
    // calculate how to scale the font to make the text fit
    float fontScale = Math.Max(s.Width / rect.Width, s.Height / rect.Height);
    using (Font fontForDrawing = new Font(font.FontFamily, font.SizeInPoints / fontScale, GraphicsUnit.Point))
    {
        g.DrawString(text, fontForDrawing, Brushes.Black, rect, stringFormat);
    }


}

また、特定のポイント サイズでテキストを印刷する場合は、測定を行う必要はありません。フォントサイズを設定するだけです:

Bitmap bm = new Bitmap(20, 20);
using (Font font = new Font(fontName, 6, GraphicsUnit.Point))
using (Graphics g = Graphics.FromImage(bm))
{
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    StringFormat stringFormat = new StringFormat()
    {
        Alignment = StringAlignment.Center,
        LineAlignment = StringAlignment.Near
    };
    Rectangle rect = new Rectangle(0, 0, bm.Width, bm.Height);
    g.DrawString(text, font, Brushes.Black, rect, stringFormat);
}
于 2009-06-17T11:19:07.163 に答える
1

私は試してみます:

int ImgQual = 600;

int Width = 50;

int Height = 50;

Font TextFont = New Font("Tahoma", 14, FontStyle.Bold)

Bitmap bmp = New Bitmap(Width, Height);

bmp.SetResolution(ImgQual, ImgQual);

System.Drawing.Graphics g = Graphics.FromImage(bmp);

System.Drawing.StringFormat sf = New System.Drawing.StringFormat();

sf.Alignment = StringAlignment.Center;

g.DrawString("a", NumberTextFont, Brushes.Black, New RectangleF(0, 0, Width, Height), sf);

return bmp;
于 2009-06-17T11:23:56.870 に答える