私のプログラム(win32、Delphi)は、テーブルのいくつかの列に特殊文字を表示する必要があります。そのために、これらの列には特別なフォントを使用します。クライアントからフォントを入手しました。 .FONフォントです。画面上では問題なく動作しますが、何かを印刷するために使いたいと思うとすぐに問題が発生します。
この.FONフォントをTrueTypeフォント(.TTF)に変換して、問題を回避したいと思います。フォントが適切に拡大縮小されなくてもかまいません。元のフォントのデフォルトサイズと同じサイズの画面で使用した場合、まったく同じに見えるはずです。誰かがその方法を知っていますか?
(ソースコードのソリューションは必要ありません。フォントは変更されません。それを行うツールを見つければ十分です)
Edit:理想は、元のフォントの各ピクセルがベクトルの黒い四角形に変換されるTrueTypeフォントを取得することです(私はいくつかの文字を再描画してテストしました)手動で、それは私が望むように動作します)。
編集2、使用されるソリューション:FontForge + Autotrace を使用して手動で修正することができましたビットマップフォントのピクセルのアウトラインに従うベクターフォントを取得します。このベクターフォントは、元のフォントよりもいくらか拡大され、印刷の問題を解決します。詳細については、承認された投稿を参照してください。
しかし、誰かが完全に自動化されたソリューションを知っているなら、私はまだ興味があります。
FontForge + Autotrace を使用して、手動で修正します。
最初にAutofortraceをFontforgeに統合します。 FontForgeのビットマップの自動トレース を参照してください。 FontForgeのwin32バージョンを使用することができなかったので、これが私がそれをどのように行ったかです:
ポータブル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
次に、フォントを変換します。
すべての文字を選択し、Shiftキーを押しながらオートトレースを開始すると、オートトレースのパラメーターを入力できます。ピクセルの輪郭の認識を改善する次のパラメーターを使用しましたが、完璧なパラメーターが見つかりませんでした。
-corner-surround=1 -line-threshold=10
私はこの質問が古いことを知っていますが、それだけの価値があるので、 PixFont を使用して古い.fonを.ttfに簡単に変換できました。私はそれを管理者として実行し(インストールなし-古い学校の実行可能ファイルを実行)、元の.fonにいくつかの正しいグリフが欠落しているにもかかわらず、優れたTTFを生成しました。
そして、それは無料ではありませんが、29ドルで、ほとんどありません。特に、非常に高価な市販製品と比較すると、それはほとんどです。
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
(ポイントを追加および削除して)フォントの見栄えを良くするには、まだ何時間もの手作業が必要でした。
FontForge を使用して、対応するTrueTypeフォントを生成することができました。これにより、適切なサイズで使用すると、元のフォントとまったく同じ文字が得られます。サイズ= 11の元のフォントを使用したため、いくつかのオプションを調整する必要があるかもしれません。新しいフォントは、delphiでは使用できないサイズ= 10.5でのみ機能します。フォントは、他のすべてのサイズで本当にひどく見えます。
どうやら、それはビットマップフォントをtruetype-fontに格納する可能性を使用しています。結果のフォントには、ビットマップフォントで発生した問題はありませんが、プリンターで完全に空白になっているため、問題が解決しません。
FontForge :に関する注意WindowsバージョンのFontForgeをインストールできませんでした( cygwinに基づく)。その代わりに、私はインストールしました Portable Ubuntu Tres 、これはWindowsで動作するLinuxバージョンです。インストールは簡単です。ファイルを解凍してexeを起動します。次に、システム->管理->アプリケーションの追加と削除を選択し、FontForgeを検索してインストールします(管理者パスワードは123456です)。 FontForgeバージョン20090622をインストールしました。
コマンドラインツール MicrosoftのSBIT32 を使用する可能性があります。 FontForge を使用すると、.FONファイルを.BDFファイルに簡単に変換できます。ただし、メトリックファイル(.MET)を書き込む必要があります。ビットマップフォントが埋め込まれたtruetype-fontが得られると思いますし、 FontForge (type "(faked)MSビットマップのみ) sfnt(ttf) "ファイル->フォントの生成)。
FONの優れたTTFバージョンを取得する最も簡単な方法は、無料のオンラインビットマップフォントエディターを使用することです。各グリフを手動で入力する必要がありますが、プロセスはFontForgeを使用するよりもはるかに簡単です。私が知っている2つのエディターがあり、どちらもWindowsおよびLinuxで正常に動作するTTFを生成します。
BitFontMaker は、2つのうちの方が簡単です。そのすっきりしたインターフェースは気に入っていますが、等幅フォントのセル幅は10から14ピクセルまでなので、使用しないことにしました。
FontStruct 登録が必要で、Flashインターフェイスを使用します。インターフェイスに慣れると、新しいフォントを非常に速く作成できました。 (偶然かもしれませんが、登録に使用したメールアカウントでスパムの増加に気づきました。)
どちらのエディターも行間を自動的に設定します。希望する間隔を得るコツは、1つの文字に高いピクセルを追加し、ベクターフォントエディターを使用してTTFから削除することです。 (Type lightはうまく機能し、FontForgeよりもはるかに使いやすくなっています。)
製品の説明によると BitFonter 3. はそれを行うことができるようです:
"FontLab StudioおよびTypeToolとの統合による、タイプ1、TrueTypeおよびOpenTypeフォントとの間のビットマップおよびビットマップフォントの強力な変換。"
ただし、1つのフォントを変換するだけでは、999米ドルは少し高くつきます。
自分が取り組んでいるプロジェクトで使用するこれらのフォントを検索していることに気づきました。他の回答で述べたように、すべてのグリフを手動で編集することを考えた上で、私は検索を続けました。最終的に、元のフォントといくつかの新しい.ttf
バリアントがあるサイトを偶然見つけました。一部のグリフが再マッピングされていることを気にしない場合(それらはすべてまだ存在します)、これは良い代替手段です Oldschool PC Fonts 。私にとっての追加のボーナスとして、これらは拡張ラテン語、ギリシャ語、キリル文字、ヘブライ語のスクリプトに加えて、追加のグリフとUnicodeシンボルの束をサポートしています。
シンプルな無料ツールでそれを実現できる可能性は低いです。 http://www.fontlab.com それを行うためのツールがありますが、非常に高価です。
私にとって有効な解決策を見つけるには、多くの手間がかかりました。
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エンコーディングを持つフォントにコピーします。
手順を実行できない場合は、何が起こっているかをお知らせください。これは本当に複雑すぎて、私が見つけたすべてのツールの効果を使用して組み合わせようとするのは大変な手間でしたが、解決策を見つけました。これは自動化されており、すべての文字を手動で再描画するよりも、文字数が多いフォントの方が簡単です。これは、ビットマップグリフを描画し、有効なビットマップフォントファイルを持っているが、まだ使用できない場合に役立ちます。
自動トレースを機能させることができなかったため、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()