2

私のプログラムでは、すべての数字文字 (0..9) を左から右に配置したビットマップと、その他のいくつかの文字を生成する必要があります。

ユーザーは UI から選択します。

  1. 目的のフォント、および
  2. 目的の文字の高さ (ピクセル単位)。

したがって、ビットマップを作成し、次にこのビットマップからグラフィックスを作成し、数字を1つずつこのビットマップに描画してから、ディスクに保存します。

何時間もかけて理解できなかったこと: 数字 '0' がユーザーによって指定された高さになるように、正しいサイズのフォントを作成するにはどうすればよいですか?

Font コンストラクターのすべてのパラメーター、StringFormat のプロパティ、MeasureString/MeasureText/MeasureCharacterRanges で遊んで、P/Invoke (正/負の nHeight) を介してネイティブの CreateFont() でフォントを作成しようとしました。「サイズ」または「高さ」と呼ばれるすべてのパラメーターは、「0」よりもはるかに大きい架空の文字のサイズを示しているようです。

行の高さ、全角の高さ、アセント、ディセントなどの理論を読みました。パディングやスペーシングなどを除いて、文字の実際の高さについての概念はないようです

再び私の質問: フォント名と '0' グリフの目的のピクセルの高さが与えられた場合、必要な高さでそのグリフを描画するフォントを作成するにはどうすればよいですか?

ガイダンスをいただければ幸いです。

後の編集私のプロジェクトに関する詳細: これは大きなディスプレイを備えた組み込みデバイスであり、デザイナーが好みのビットマップ フォントを生成して試すための簡単な方法を提供する必要があります。このようなビットマップ フォントを生成する Windows ツールは、私にとって優れたソリューションのように思えました。

4

2 に答える 2

1

以前にここに投稿したものとはかけ離れていませんでしたが、実際には機能しませんでした。これに頭を悩ませているうちに、graphics.MeasureString("M", ...) が graphics.MeasureString("MM", ...) よりもはるかに大きな高さを報告することに注目したのは興味深いことでした。手でフォント サイズを計算すると、最初の (GetEMSize の応答と相関する) が実際には行全体のサイズであることがわかりました。最終的に、数字の実際の文字サイズは、実際のものであろうと .net であろうと、どのメトリックとも関連付ける必要がないことに気付きました。

于 2013-11-05T11:56:45.247 に答える
0

このフォントコンストラクターを使用して、 GraphicsUnitをピクセルとして指定できると思います。次に、適切なサイズのフォントを作成する必要があります。

テストコードの追加-ケースに応じて編集し、スタイルを判断しないでください。LINQPadに貼り付けて、画像を生成できるものが必要でした。

using (var font = new Font("Arial",10,FontStyle.Regular, GraphicsUnit.Pixel))
using (var image = new Bitmap(30, 15))
using (var graphics = Graphics.FromImage(image))
{
    graphics.FillRectangle(Brushes.White, new Rectangle(0, 0, 30, 15));
    graphics.DrawString("Ay", font, Brushes.Black, 0, 0);
    image.Save(@"E:\test.bmp", ImageFormat.Bmp);
}

ピクセル単位でサイズを設定するときは、フォント内のすべての文字がその範囲内に収まる必要があることを覚えておいてください。つまり、ディセンダー付きの文字とアセンダー付きの文字を意味します。

于 2012-08-22T18:03:13.897 に答える