5

私は独自のビットマップ フォント レンダラーに取り組んできましたが、文字間隔が正しく設定されている可能性はあると思いますが、文字の y 配置を決定する方法がわかりません。たとえば、文字「a」の y の配置が 0 の場合、「*」または「,」は何になりますか? 文字間の間隔を決定するためにwinapi関数を使用していますがGetCharABCWidthsFloatW、ある種のyオフセットを決定するために使用できる別の関数はありますか?

私は自分のビットマップ イメージに最適にフィットするようにしているので、常に同じサイズになるとは限りません。

4

4 に答える 4

0

GetTextMetricsが正解です。しかし、demorgeは、Y座標に使用する必要のあるフィールドがtmAscentであると言いたかったかもしれません(構造を見てください)。

全高はtmHeightです。tmAscentは、上部からベースラインまでの距離です。また、tmDescentは、ベースラインとフォントの下部の間の距離です。

したがって、ほとんどの場合、(x、y)座標でテキストの左上隅を参照する場合は、tmAscentを追加する必要があります。y座標が下の場合は、tmDescentを減算します(+または-は、ビューポートを反転したかどうかによっても異なりますが、何が得られるかをテストして確認できます)。

その情報は、「a」、「*」、または「j」のいずれを記述しても機能します。ベースラインはすべてのキャラクターで同じです。

于 2012-05-28T03:08:02.633 に答える
0

一般的なフォント情報:

あなたが探しているのは、テキストの配置を「ベースライン」または「原点」(同じ概念)に正規化する方法です。座標系に応じて、アセント (アセンダー) またはディセント (ディセンダー) でこれを行うことができます。

http://www.freetype.org/freetype2/docs/tutorial/step2.html

これは、タイポグラフィに関連する非常に優れたサンプル画像のセットを提供します。

一般的なビットマップ フォント情報:

ここで、ビットマップ イメージに関して、それらがすべて適切に整列されていることを確認する最も簡単な方法は、スプライト シート内の各文字のビットマップ表現の高さを同じにすることです (ただし、幅は実際の文字幅に基づいて異なる必要があります)。これを行うと、その共有された高さに基づいてすべてを単純に並べることができます。

ただし、文字の周りの余分な空白を切り取る場合は、切り取った値をグリフとともに何らかの構造体に格納して、オフセットを決定できるようにする必要があります。API がこれを行っている場合、文字に基づいて完全な寸法を取得できるアセンダー/ディセンダー、原点/ベースライン、または行の高さタイプのメソッドが含まれている可能性が高いため、これを適切に行うことができます。

API固有の情報
編集:他の回答に基づいて、API固有の質問に関連するリンクを次に示します。

GetTextMetrics:
http://msdn.microsoft.com/en-us/library/dd144941(v=vs.85).aspx

TEXTMETRIC 構造体:
http://msdn.microsoft.com/en-us/library/dd145132(v=vs.85).aspx

tmAscent または tmDescent を使用して、y 座標をオフセットできます。

于 2012-05-30T18:17:58.440 に答える
0

私の理解が正しければ、各グリフのビットマップは最初は同じ高さです。次に、各グリフの周囲の余白をすべてトリミングして、各文字の最小限のビットマップを作成します。

この場合の答えは簡単です。トリミングされたビットマップを作成するときは、グリフの配置方法に応じて、左と上 (または左と下) から削除するピクセル数を覚えておいてください。ビットマップを描画すると、保存された値を使用して座標を調整できます。

ただし、フォント メトリックを使用して各ビットマップからどの程度トリミングするかを決定しようとしても、それはできません。

于 2012-05-28T16:34:42.820 に答える
0

TextOut各文字自体は、テキスト レンダリング API ( 、など)によって y 方向に正しくオフセットされDrawTextている必要があるため、一定のオフセットが必要です。一般的なメトリックを取得するために使用する文字列「Ag」のメトリックを常に取得します。さらに、 GetTextMetricsGetTextExtentPoint32を試すことができます。

于 2012-05-24T07:29:36.387 に答える