1

高さ 10 ピクセルのビットマップ書体を dafont リポジトリから TTF 形式で集めました。ただし、実際のビットマップ データはベクター形式のように見え、レンダリング時にポイント サイズとピクセル サイズの対応がわからないため、それらから実際のビットマップ データを抽出するのに苦労しています。レター形式に対応する正確なピクセル単位のビットマップ データを取得するためのソフトウェア ツール、ライブラリ、またはアプローチに関する提案が必要です。

問題を理解できるフォントの例は、http://www.dafont.com/commodore-64-pixelized.fontです。

私の目的は、これらのビットマップ フォントの 1 つ以上を使用して、http://shrimping.itプロジェクトの一部として Arduino ベースの Persistence Of Vision (POV) ディスプレイを制御することです。

POV デバイスは、LED の列を使用して、デバイスを左右に動かすと LED が点滅して空中にテキストを描画します。よく知られている例は、Adafruit の MiniPOV http://www.ladyada.net/make/minipov3/です。

LED を点滅させるマイクロコントローラ コードを記述するには、書体からピクセルごとの情報を取得する必要があります。文字ごと、フォントごとに手動で行う。

これまで、Processing (http://processing.org) で実験を行ってきましたが、ポイント サイズを選択して TTF をレンダリングし、フォントが基になるグリッドと完全に一致して描画されるようにする方法がわかりません。ピクセルの。これがあれば、情報を導き出すことができますが、そこにたどり着けないようです。Processing によって報告される te​​xtAscent と textDescent の値は、少なくとも私が試したフォントでは、がらくたのように見えます。

私がテストしているフォントは、Advocut、Andina、Aux DotBitC、BM チューブ、Commodore 64 Pixelized、Homespun BRK、Nayupixel、SG05、および Visitor です。問題をよりよく理解するために元のデータを表示する必要がある場合は、dafont.com で検索して、これらのいずれかを自分で取得できます。

4

2 に答える 2

1

私はこれを修正する方法を見つけました。これは 3 つの部分に分かれています。

ステージ1

最初に、Python を使用して、インタラクティブな Python シェルから、「python」と入力して、すべての印刷可能なグラフィック ASCII 文字を出力しました。

import string
print(''.join([chr(x) for x in range(33,127)]))

...次の文字列が得られます - SPACE (32) と DEL (127) を省略します...

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

ステージ 2

次に、Inkscape を起動し、[表示] > [グリッド] で表示可能なピクセル グリッドを有効にし、指定されたフォントで 1 行にすべての文字を含むテキスト要素を作成しました。非ピクセルグリフに戻った文字を視覚的に確認しました。(文字が完全に指定されていない場合、整数以外のピクセル数の通常のベクターフォントが挿入されると思います。これにより、水平方向のカーニングが台無しになり、残りの文字の位置がずれるため、置換する必要があります)。見たピクセル化されていない文字を疑問符だけに置き換えました。これは、これらの書体に確実に存在し、ピクセル数が整数であると思われる文字です。

すべての文字がきれいなピクセル化された文字になると、テキスト要素が選択され (座標バーが上部に表示されます)、ビューがズームインされ、テキストを 0,0 に配置し、ピクセルの高さを選択することができました手動でピクセル要素をバッキンググリッドに合わせました(8、9、10、11ピクセルの高さから切り替えたときに、ロック記号がアクティブになって水平方向と垂直方向の寸法が一緒にスケーリングされたことを確認してください。場合によっては、これらのいわゆる10 ピクセルのフォントは、正しく並べると実際には 8 ピクセルまたは 11 ピクセルの高さであり、いくつかの問題が説明されています。

正確な高さのマッピングがわずかにずれている場合があったため、水平方向のピクセル数が正しいことを確認して調整しました (たとえば、実際の高さが、横が 618 ピクセル、高さが 7.005 ピクセルのように、分数である場合がありました。文字に沿ってスキャンすることで、ピクセルはわずかに短いかわずかに長く、ピクセルがグリッドに収まるまで幅を整数に設定します. 高さの浮動小数点の違いは Inkscape ではほとんど見えず、エクスポートには目に見える影響はありません (端数は四捨五入されます)。水平方向のカウントが間違っている場合、ピクセル マッピングが実行され、量子化しようとするとオフセットが原因で水平方向にぼやけたピクセルが生成されます。

最後に、テキスト要素を選択したまま、[ファイル] > [ビットマップのエクスポート] を選択し、[選択] タブを選択しました。8、10、11、または前のステップで発見されたピクセル数で PNG をエクスポートすると、完全なピクセル マッピング (ビットマップを抽出するための単純なルーチンを書き込むことができるファイル) を持つピクセル グラフィックスが生成されます。

ステージ3

最後に、PNG をインポートし、POV ビットマップの正しい文字ごとの情報を抽出する手順を作成する必要があります。

文字の水平範囲を確実に検出し、これらを POV の個々のシーケンスにスライスできるルーチンを思いつきました。これらは等幅書体ではないため、各文字の幅は予測できません。たとえば、感嘆符の幅はわずか 2 ピクセルです。2 つのギャップを含む二重引用符文字には、特別なケースをコーディングする必要がありました。

私の抽出ルーチンのソースは現在...

http://shrimping.it/shrimp/project/pov/font/extract_font.py

...そして、ディレクトリにCDして実行することにより、ディレクトリ内の一連のpngファイルに対して実行できます

python extract_font.py

これにより、文字ごとに個別のビットマップが生成され、フォントごとに個別のディレクトリに抽出されます。

于 2012-10-20T15:53:39.690 に答える