web-dev-qa-db-ja.com

これはどのフォント形式ですか?

E Ink display 購入したのは、組み込みコマンドを使用したテキストの表示をサポートしています。ドキュメントによると、漢字用に別の「フォントライブラリ」をロードすることもできます。

フォントライブラリ

システムに組み込まれている32、48、64ドットの英語フォントは、TFカードやNandFlashを使用しなくてもいつでも利用できます。ただし、32、48、および64ドットの中国語フォントの場合、使用する前に、相対ライブラリファイルをTFカードまたはNandFlashに保存する必要があります。

この表示用のGitHubライブラリでこれらのフォントファイルの1つのサンプルを見つけました: GBK32.FONGBK48.FON および GBK64.FON

残念ながら、これは私が得た限りです。

  • fileは何も役に立ちません(_GBK32.FON: data_)

  • FontForge エラーが発生します:GBK32.FON is not in a known format (or uses features of that format fontforge does not support, or is so badly corrupted as to be unreadable)

  • TrID 出力100.0% (.ABR) Adobe PhotoShop Brush (1002/3)、しかしPhotoshopでファイルを開くことができませんでした

  • PSFTools 有効なWindows.FONまたは.FNTファイルとして認識しません

  • 16進エディタは、マジックナンバーがないことを示しています-実際、3つのファイルすべての最初の15バイトはゼロです

  • ファイルのサイズに基づくと、ファイルはある種のビットマップであるように見えます(_GBK32.FON_のサイズ/ 32 ^ 2 = _GBK48.FON_のサイズ/ 48 ^ 2 = _GBK64.FON_のサイズ/ 64 ^ 2)

この説明に合う可能性のある「既知の」ビットマップフォントはありますか?このフォーマットを理解するために他に何を試みることができますか?

3
fstanis

私の良さ!私は助けを求めに行きましたが、助けを求めないようにというヒントボックスがポップアップしました...そう、3日後に私は自分でそれをしたので、いくつかの追加のヒントを共有したいと思いました。

ファイルをJavaにプルするのはとても簡単です。

グリフをインポートするには、(擬似コード)を使用します。

BufferedInputStream bf = new BufferedInputStream(importGBKFileStream);

byte glyphline[] = new byte[glyphBitWith/8];  // 64 for GBK 64

while (bf.available() > 0) {

bf.read(glyphline);
for(int i = 0 ; i < glyphline.length ; i++){

String s = ("0000000" + Integer.toBinaryString(0xFF & glyphline[i])).replaceAll(".*(.{8})$", "$1");

... etc

EPDにグリフを表示するには

遊んだ後、キャラクターごとに2バイトをEPDに送信する必要があります。これらの文字は、(上位バイト)0x81、(下位バイト)0x40から始まります。

これは良い参考資料です https://en.wikipedia.org/wiki/GBK GBKデータセットがどのように配置されているかを確認してください。もう1つの役立つリファレンスは次のとおりです https://r12a.github.io/apps/encodings/

カスタムフォントの作成(擬似コード)

.ttfファイルをダウンロードしてJavaで開きます

    Font font = Font.createFont(Font.TRUETYPE_FONT, inttf);
    font = font.deriveFont((float) 64); 

    // for all characters in ASCII table

    text = Character.toString(chara);

    img = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_BYTE_BINARY);
    g2d = img.createGraphics();

    g2d.setColor(Color.BLACK);
    g2d.fillRect(0, 0, imageWidth, imageHeight);
    g2d.setColor(Color.WHITE);
    g2d.setFont(font);
    fm = g2d.getFontMetrics();

    // for all ascii values 0 - 256,  xpos
    g2d.drawString(text, 0, fm.getAscent());

    // use the character and the derrived with from the FontMetrics to
    // create a map for spacing the text manually                         
    characterWidthLogger(chara, textWidth);

    // should have the image as a dataByte buffer
    WritableRaster raster = img.getRaster();
    DataBufferByte data   = (DataBufferByte) raster.getDataBuffer();

    // output the data to a file or screen                                 
    displayByteArray(data ,imageHeight, imageWidth);

CharacterWidthLogger()は重要です。 EPDを制御するマイクロでは、characterWidthマップを使用して間隔をとして設定します。そのため、「テキスト」コマンドは4つの個別のコマンド((x0、y0、 "T")、(x0 + width'T "、y0" e ")など)になり、各文字は中国語形式に変換されます。 GBKファイル内のどこにグリフを配置するかはあなた次第です。epdはGBK32、GBK48、GBK64の3つのファイルのみを許可します。最初の上部0x81、下部0x80で中国語のグリップをコピーしました。したがって、ascii0x54であるTは次のようになります。 0x81、0xD4。

それが役に立てば幸い

ヘイデン

1