web-dev-qa-db-ja.com

ビットマップフォント(.FON)をTrueTypeフォント(.TTF)に変換する方法

私のプログラム(win32、Delphi)は、テーブルのいくつかの列に特殊文字を表示する必要があります。そのために、これらの列には特別なフォントを使用します。クライアントからフォントを入手しました。 .FONフォントです。画面上では問題なく動作しますが、何かを印刷するために使いたいと思うとすぐに問題が発生します。

この.FONフォントをTrueTypeフォント(.TTF)に変換して、問題を回避したいと思います。フォントが適切に拡大縮小されなくてもかまいません。元のフォントのデフォルトサイズと同じサイズの画面で使用した場合、まったく同じに見えるはずです。誰かがその方法を知っていますか?

(ソースコードのソリューションは必要ありません。フォントは変更されません。それを行うツールを見つければ十分です)

Edit:理想は、元のフォントの各ピクセルがベクトルの黒い四角形に変換されるTrueTypeフォントを取得することです(私はいくつかの文字を再描画してテストしました)手動で、それは私が望むように動作します)。

編集2、使用されるソリューション:FontForge + Autotrace を使用して手動で修正することができましたビットマップフォントのピクセルのアウトラインに従うベクターフォントを取得します。このベクターフォントは、元のフォントよりもいくらか拡大され、印刷の問題を解決します。詳細については、承認された投稿を参照してください。

しかし、誰かが完全に自動化されたソリューションを知っているなら、私はまだ興味があります。

20
Name

FontForge + Autotrace を使用して、手動で修正します。

最初にAutofortraceをFontforgeに統合します。 FontForgeのビットマップの自動トレース を参照してください。 FontForgeのwin32バージョンを使用することができなかったので、これが私がそれをどのように行ったかです:

  1. ダウンロードして解凍し、起動します Portable Ubuntu Tres 。これは、Windowsで動作する特別なLinuxバージョンです。
  2. システム->管理->アプリケーションの追加と削除を選択し、FontForgeを検索してインストールします(管理者パスワードは123456です)。 FontForgeバージョン20090622をインストールしました。
  3. http://autotrace.sourceforge.net/index.html#download からautotrace-0.31.1.tar.gzをダウンロードし、ポータブルUbuntuのホームディレクトリにコピーします。
  4. ポータブルUbuntuでは、アプリケーション->アクセサリ->ターミナルを選択して、autotraceをコンパイルしてインストールします。

    Sudo bash  (password is 123456)
    gunzip autotrace-0.31.1.tar.gz
    tar xf autotrace-0.31.1.tar
    cd autotrace-0.31.1
    ./configure
    make
    make install
    

次に、フォントを変換します。

  1. Portable UbuntuでFontForgeを起動し、.FONフォントを開きます。
  2. フォントを.BDFフォントとして保存します(.FONファイルをバックグラウンドとしてロードしても機能しなかったため、最初にフォントを変換する必要がありました)。
  3. 新しいフォントを作成し、BDFフォントをバックグラウンドフォントとしてインポートします。[ファイル]-> [インポート]をクリックし、[背景として]を選択することを忘れないでください。
  4. すべての文字を選択し、Shiftキーを押しながらオートトレースを開始すると、オートトレースのパラメーターを入力できます。ピクセルの輪郭の認識を改善する次のパラメーターを使用しましたが、完璧なパラメーターが見つかりませんでした。

    -corner-surround=1 -line-threshold=10
    
  5. ほとんどの場合「曲線点を追加」機能を使用して、文字を手動で修正します。 [表示]-> [表示]-> [ほぼ水平/垂直の線]をアクティブにすると、作業がはるかに簡単になります。
  6. TrueTypeフォントを生成します:ファイル->フォントを生成し、フォーマットとしてTrueTypeを選択します。
15
Name

私はこの質問が古いことを知っていますが、それだけの価値があるので、 PixFont を使用して古い.fonを.ttfに簡単に変換できました。私はそれを管理者として実行し(インストールなし-古い学校の実行可能ファイルを実行)、元の.fonにいくつかの正しいグリフが欠落しているにもかかわらず、優れたTTFを生成しました。

そして、それは無料ではありませんが、29ドルで、ほとんどありません。特に、非常に高価な市販製品と比較すると、それはほとんどです。

9

Fontforge(Windows用)をコンパイルしたくない場合は、こちらからダウンロードしてください: http://www.mpetroff.net/software/fontforge-windows/

そのビルドでは、autotraceではなくpotraceを使用します。私が変換していたフォント(vgasys.fon)で得た最高のパラメーターは次のとおりです。

--turdsize 0 --opttolerance 0 --unit 1 --longcurve --gamma 0 --blacklevel 0 --cleartext

(ポイントを追加および削除して)フォントの見栄えを良くするには、まだ何時間もの手作業が必要でした。

6
Mogu

FontForge を使用して、対応するTrueTypeフォントを生成することができました。これにより、適切なサイズで使用すると、元のフォントとまったく同じ文字が得られます。サイズ= 11の元のフォントを使用したため、いくつかのオプションを調整する必要があるかもしれません。新しいフォントは、delphiでは使用できないサイズ= 10.5でのみ機能します。フォントは、他のすべてのサイズで本当にひどく見えます。

  1. FontForgeに.FONフォントをロードします
  2. 「ファイル」->「フォントの生成」を選択します
  3. タイプとして「(偽造)MSビットマップのみsfnt(ttf)」を選択し、ファイル名を入力して、「保存」をクリックします。

どうやら、それはビットマップフォントをtruetype-fontに格納する可能性を使用しています。結果のフォントには、ビットマップフォントで発生した問題はありませんが、プリンターで完全に空白になっているため、問題が解決しません。

FontForgeに関する注意WindowsバージョンのFontForgeをインストールできませんでした( cygwinに基づく)。その代わりに、私はインストールしました Portable Ubuntu Tres 、これはWindowsで動作するLinuxバージョンです。インストールは簡単です。ファイルを解凍してexeを起動します。次に、システム->管理->アプリケーションの追加と削除を選択し、FontForgeを検索してインストールします(管理者パスワードは123456です)。 FontForgeバージョン20090622をインストールしました。

4
Name

コマンドラインツール MicrosoftのSBIT32 を使用する可能性があります。 FontForge を使用すると、.FONファイルを.BDFファイルに簡単に変換できます。ただし、メトリックファイル(.MET)を書き込む必要があります。ビットマップフォントが埋め込まれたtruetype-fontが得られると思いますし、 FontForge (type "(faked)MSビットマップのみ) sfnt(ttf) "ファイル->フォントの生成)。

2
Name

FONの優れたTTFバージョンを取得する最も簡単な方法は、無料のオンラインビットマップフォントエディターを使用することです。各グリフを手動で入力する必要がありますが、プロセスはFontForgeを使用するよりもはるかに簡単です。私が知っている2つのエディターがあり、どちらもWindowsおよびLinuxで正常に動作するTTFを生成します。

BitFontMaker は、2つのうちの方が簡単です。そのすっきりしたインターフェースは気に入っていますが、等幅フォントのセル幅は10から14ピクセルまでなので、使用しないことにしました。

FontStruct 登録が必要で、Flashインターフェイスを使用します。インターフェイスに慣れると、新しいフォントを非常に速く作成できました。 (偶然かもしれませんが、登録に使用したメールアカウントでスパムの増加に気づきました。)

どちらのエディターも行間を自動的に設定します。希望する間隔を得るコツは、1つの文字に高いピクセルを追加し、ベクターフォントエディターを使用してTTFから削除することです。 (Type lightはうまく機能し、FontForgeよりもはるかに使いやすくなっています。)

2
user3720403

製品の説明によると BitFonter 3. はそれを行うことができるようです:

"FontLab StudioおよびTypeToolとの統合による、タイプ1、TrueTypeおよびOpenTypeフォントとの間のビットマップおよびビットマップフォントの強力な変換。"

ただし、1つのフォントを変換するだけでは、999米ドルは少し高くつきます。

1
Name

自分が取り組んでいるプロジェクトで使用するこれらのフォントを検索していることに気づきました。他の回答で述べたように、すべてのグリフを手動で編集することを考えた上で、私は検索を続けました。最終的に、元のフォントといくつかの新しい.ttfバリアントがあるサイトを偶然見つけました。一部のグリフが再マッピングされていることを気にしない場合(それらはすべてまだ存在します)、これは良い代替手段です Oldschool PC Fonts 。私にとっての追加のボーナスとして、これらは拡張ラテン語、ギリシャ語、キリル文字、ヘブライ語のスクリプトに加えて、追加のグリフとUnicodeシンボルの束をサポートしています。

1
datatype_void

シンプルな無料ツールでそれを実現できる可能性は低いです。 http://www.fontlab.com それを行うためのツールがありますが、非常に高価です。

1
Strelok

私にとって有効な解決策を見つけるには、多くの手間がかかりました。

Autotraceは、入力がスケーリングされた場合、ピクセルパーフェクトな出力を生成するようです。私の経験から、少なくとも8倍のスケーリングは完全に機能します。

ソフトウェアが閉じているため、入力のスケーリングは非常に複雑です。

Bitfonter bdfフォントを開くことができ(Unicodeをサポートしています)、スケーリングできます。デモ版の問題は、エクスポート時にグリフの半分が「破損」し(ピクセルがランダムに削除される)、これによりAutotraceが再び望ましくない出力を生成することです。しかし、文字が「破損」しているパターンがあることに気づきました。1番目と2番目のグリフは破損しており、3番目と4番目のグリフは破損しておらず、5番目と6番目のグリフは破損しています。それで、私はそれを再びスケーリングすることによって補完的なbdfファイルを作りました、しかし最初の2つのグリフを削除しました。次に、FontForgeでこれら2つを組み合わせることができます。これらの両方の出力ファイルを開き、「エンコード」で「再エンコード」を「グリフの順序」にして、output2ですべてを選択してコピーし、output1で3番目のグリフをクリックしてCtrl + Shift +を押します。 V.これにより、両方の出力ファイルが結合され、手動で実行できる最初の2つのグリフを除いて、すべての文字が完全に破損せずにスケーリングされます。結果を保存します。

このスケーリングされた出力で「自動トレース」を実行します。次に、すべてのグリフでElement\Transformations\Transformを使用し、次の設定を使用します。Origin:Glyph Origin、Scale Uniformly ...以前にbdfをスケーリングしたものの逆(8xスケーリングの場合は12.5%)。

必要以上のポイントがあります。これは、Element\Simplify\Simplifyを使用して解決できます。これにより、アウトラインが簡略化されます。輪郭が水平線と垂直線だけで構成されているこの特定のケースでは、この操作はロスレスでなければなりません。

すると、結局のところ、グリフには一見Unicode情報がないようです。結果のフォントの文字が正確に含まれているフォントを開き、そのフォントでEncoding\Reencode\ISO 10646-1(Unicode、BMP)を使用してから、Compactを使用します。次に、すべての適切なアウトラインを持つフォントのすべての文字を、すべての適切なUnicodeエンコーディングを持つフォントにコピーします。

手順を実行できない場合は、何が起こっているかをお知らせください。これは本当に複雑すぎて、私が見つけたすべてのツールの効果を使用して組み合わせようとするのは大変な手間でしたが、解決策を見つけました。これは自動化されており、すべての文字を手動で再描画するよりも、文字数が多いフォントの方が簡単です。これは、ビットマップグリフを描画し、有効なビットマップフォントファイルを持っているが、まだ使用できない場合に役立ちます。

0

自動トレースを機能させることができなかったため、A pythonスクリプトを記述して、白黒の画像をピクセルごとに1つずつベクトルポリゴンにトレースしました。

したがって、グリフ画像のフォルダーを使用して、svgファイルのフォルダーに変換できます。

次に、Inkscape union +パスを単純化して、各グリフをクリーンアップします。 (Inkscapeを使用してコマンドラインで実行できる場合があります)

最後に、各グリフの対応するsvgをFontForgeにインポートします。

-> Gist.gisthub.com でホストされているスクリプト

from PIL import Image
import svgwrite
import os
import argparse


def bmp_to_svg(filename, multiply =1):

    img = Image.open(filename)
    w, h = img.size
    pixel_acc = img.load()

    generated_paths = paths_gen(pixel_acc, w,h, multiply=multiply)

    dwg = svgwrite.Drawing(profile='tiny')
    for path in generated_paths:
        options = path
        kwoptions = {} #{"fill":"black"}
        dwg.add(dwg.polygon(options, **kwoptions))

    #clip_path = dwg.defs.add(dwg.clipPath())
    #clip_path.add(dwg.Rect(insert=(0,0), size=((w*multiply)+1, (h*multiply)+1)))
    return dwg

def paths_gen(pixel_acc, w, h, multiply = 1):
    m = multiply
    paths = []
    for y in range(0,h):
        for x in range(0,w):
            pix = pixel_acc[x,y]
            brightval = sum(pix) /3
            if brightval < 128:
                paths.append([
                        ##top left
                        (x * m, y * m),
                        ##top right
                        ((x+1) * m, y * m),
                        ##bottom right
                        ((x+1) * m, (y+1) * m),
                        ##bottom list
                        ((x) * m, (y+1) * m),
                        ##close back to top left
                        #(x, y), 
                    ])
    return paths


def main():
    parser = argparse.ArgumentParser(
        description='Script to convert black and white images into vector art')
    parser.add_argument("input_dir")
    parser.add_argument("ouput_dir")
    parser.add_argument("in_ext", default="bmp", help="file extension of images in input folder")
    parser.add_argument("-m", "--multiply", default=1, type=int)
    ## TODO
    #parser.add_argument("-u", "--union", store=True, help="unifies adjecent polgons")
    #parser.add_argument("-s", "--simplify", store=True, help="removes points that are part of a straight line")
    #parser.add_argument("-c", "--compress", store=True, help="same as '--union --simplify'")

    args = parser.parse_args()


    cdir = os.path.abspath(args.input_dir)

    fn_gen = ( x for x in os.listdir(cdir)
                 if x.endswith('.'+args.in_ext)
             )

    for count, filename in enumerate(fn_gen):

        full_filename =  os.path.join(cdir, filename)

        new_fn = "{}_.svg".format(filename)
        new_fullfn =  os.path.join(args.ouput_dir, new_fn)


        svg = bmp_to_svg(full_filename, multiply=args.multiply)
        print "Converted file: '{}'".format(full_filename)
        svg.filename = new_fullfn
        svg.save()

if __name__ == '__main__':
    main()
0
Zv_oDD