web-dev-qa-db-fra.com

Comment convertir une police bitmap (.FON) en une police TrueType (.TTF)?

Mon programme (win32, Delphi) doit afficher des caractères spéciaux dans certaines colonnes d'une table. Pour ce faire, j'utilise une police spéciale pour ces colonnes. J'ai la police de mon client. C'est une police .FON. Cela fonctionne bien sur l'écran mais j'ai souvent des problèmes dès que je veux l'utiliser pour imprimer quelque chose.

Je voudrais convertir cette police .FON en police TrueType (.TTF) pour éviter les problèmes. Je me fiche de savoir si la police n’est pas bonne. Je devrais avoir exactement le même aspect lorsque je l’utilise à l’écran avec la même taille que la taille par défaut de la police d’origine ... Est-ce que quelqu'un connaît un moyen de le faire?

(Il n'est pas nécessaire de disposer d'une solution de code source. La police ne changera pas. C'est suffisant si je trouve un outil pour le faire.)

Edit: L'idéal serait d'obtenir une police TrueType dans laquelle chaque pixel de la police d'origine est converti en un carré noir vectoriel (j'ai testé en redessinant manuellement quelques caractères, cela fonctionnerait comme je le voulais).

Edit 2, solution utilisée: Utilisation de FontForge + Autotrace puis en apportant des corrections manuellement, j'ai pu obtenir une police vectorielle qui suit le contour des pixels de la police bitmap. Cette police vectorielle évolue un peu mieux que la police d'origine et résout mes problèmes d'impression. Voir poste accepté pour plus de détails.

Mais je suis toujours intéressé si quelqu'un connaît une solution entièrement automatisée.

18
Name

Utilisez FontForge + Autotrace puis apportez quelques corrections manuellement.

Commencez par intégrer Autotrace dans Fontforge, voir Autotracing bitmaps dans FontForge . Voici comment je l'ai fait, car je n'ai pas pu utiliser la version win32 de FontForge:

  1. Téléchargez, décompressez et démarrez Portable Ubuntu Tres . C'est une version spéciale de Linux qui fonctionne sous Windows!
  2. Choisissez Système-> Administration-> Ajout/Suppression d'applications, recherchez FontForge et installez-le (le mot de passe de l'administrateur est 123456). J'ai installé la version 20090622 de FontForge.
  3. Téléchargez autotrace-0.31.1.tar.gz depuis http://autotrace.sourceforge.net/index.html#download et copiez-le dans votre répertoire personnel dans Portable Ubuntu.
  4. Dans Ubuntu Portable, choisissez Applications-> Accessoires-> Terminal pour compiler et installer le traçage automatique:

    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
    

Puis convertissez votre police:

  1. Démarrez FontForge dans Portable Ubuntu et ouvrez la police .FON.
  2. Enregistrez votre police en tant que police .BDF (le chargement d'un fichier .FON en tant qu'arrière-plan ne fonctionnait pas, je devais donc d'abord convertir la police): Fichier-> Générer des polices et choisir BDF comme format.
  3. Créez une nouvelle police et importez la police BDF en tant que police d'arrière-plan: Fichier-> Importer et n'oubliez pas de sélectionner "En tant qu'arrière-plan".
  4. Sélectionnez tous les caractères et démarrez une trace automatique tout en maintenant la touche Maj enfoncée pour pouvoir entrer les paramètres de trace automatique. J'ai utilisé les paramètres suivants, ce qui a amélioré la reconnaissance du contour des pixels, mais je n'ai pas trouvé les paramètres parfaits:

    -corner-surround=1 -line-threshold=10
    
  5. Corrigez les caractères manuellement à l’aide de la fonction "Ajouter un point de courbe" . Activer Affichage-> Afficher-> Lignes presque horizontales/verticales facilite grandement le travail.
  6. Générez une police TrueType: Fichier-> Générer des polices et choisissez TrueType comme format.
15
Name

Je sais que cette question est ancienne, mais pour ce que cela vaut, j’ai pu convertir facilement un vieux .fon en .ttf en utilisant PixFont . Je l'ai exécuté en tant qu'administrateur (aucune installation - un ancien exécutable en place) et il a généré un bon TTF même si le fichier .fon d'origine manquait de certains glyphes corrects.

Et, même s’il n’est pas gratuit, il coûte presque 29 dollars, surtout par rapport aux produits commerciaux très onéreux. 

9
Ian Patrick Hughes

Pour ceux qui ne veulent pas compiler fontforge (pour Windows), téléchargez le fichier ici: http://www.mpetroff.net/software/fontforge-windows/

Cette construction utilise potrace au lieu de autotrace. Les meilleurs paramètres que j'ai obtenus pour la police que je convertissais (vgasys.fon) étaient:

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

Il restait encore des heures de travail manuel à faire bien paraître la police (en ajoutant et en supprimant des points).

6
Mogu

En utilisant FontForge j’ai été capable de générer une police TrueType correspondante, qui donne exactement les mêmes caractères que la police d’origine quand elle est utilisée à la bonne taille. Peut-être ai-je encore besoin d'ajuster certaines options, car j'ai utilisé ma police d'origine à la taille = 11. La nouvelle police ne fonctionne bien qu'à la taille = 10,5, impossible à utiliser avec Delphi. La police a l'air vraiment horrible à chaque autre taille.

  1. Charger la police .FON dans FontForge
  2. Choisissez Fichier-> Générer des polices
  3. Sélectionnez le type "(imité) MS bitmap seulement sfnt (ttf)", entrez un nom de fichier et cliquez sur "enregistrer".

Apparemment, il utilise une possibilité de stocker des polices bitmap dans une police TrueType. La police résultante ne présente pas les problèmes que j'ai rencontrés avec les polices bitmap, mais elle est complètement vierge sur l'imprimante, ce qui ne résout pas le problème.

Une note à propos de FontForge :Je n’ai pas réussi à installer la version Windows de FontForge (basée sur cygwin). Au lieu de cela, j’ai installé Portable Ubuntu Tres , Il s’agit d’une version facile à installer: décompressez le fichier et démarrez le fichier exe, puis sélectionnez Système-> Administration-> Ajout/Suppression d’applications, recherchez FontForge et installez-le (le mot de passe de l'administrateur est 123456). FontForge 20090622 version installée.

4
Name

Une possibilité pourrait être d'utiliser l'outil de ligne de commande SBIT32 de Microsoft . Il est facile de convertir le fichier .FON en fichier .BDF avec FontForge . Mais vous devez ensuite écrire un fichier de métriques (.MET). Je ne l'ai pas essayée, car je suppose que j'aurais une police TrueType avec une police bitmaps intégrée et qu'il est possible de générer ces polices directement avec FontForge (type "(falsifié). ) "sous Fichier-> Générer les polices).

2
Name

J'ai trouvé que le moyen le plus simple d'obtenir une bonne version TTF d'un fichier FON est d'utiliser l'un des éditeurs de polices bitmap en ligne gratuits. Vous devez entrer manuellement chaque glyphe, mais le processus est beaucoup plus simple que de se familiariser avec FontForge. Je connais deux éditeurs, qui produisent tous deux des fichiers TTF qui fonctionnent correctement sous Windows et Linux.

BitFontMaker est le plus simple des deux. J'aime son interface épurée, mais je n'ai finalement pas l'utiliser car les polices à espacement fixe ne peuvent avoir qu'une largeur de cellule de 10 à 14 pixels.

FontStruct nécessite un enregistrement et utilise une interface Flash. Une fois que je me suis habitué à l'interface, j'ai pu créer de nouvelles polices assez rapidement. (C'est peut-être une coïncidence, mais j'ai remarqué une légère hausse du spam sur le compte de messagerie que j'avais l'habitude d'enregistrer.)

Les deux éditeurs définissent l'interligne automatiquement. Une astuce pour obtenir l'espacement souhaité consiste à ajouter un pixel élevé sur un caractère, puis à l'aide d'un éditeur de polices vectorielles pour le supprimer du fichier TTF. (Type light fonctionne bien et est beaucoup plus facile à utiliser que FontForge.)

2
user3720403

Selon la description du produit BitFonter 3.0 semble être capable de le faire:

"Conversion puissante des polices bitmap et bitmap de et vers les polices Type 1, TrueType et OpenType via l'intégration à FontLab Studio et TypeTool."

Mais 999 US $ est un peu cher de convertir une seule police.

1
Name

Je me suis retrouvé à chercher ces polices à utiliser avec un projet sur lequel je travaille. J'ai eu envie de modifier manuellement tous les glyphes, comme mentionné dans les autres réponses. Finalement, je suis tombé sur un site qui a la police d'origine ainsi que de nouvelles variantes .ttf. Si vous n’aimez pas que certains glyphes aient été remappés (ils sont tous encore présents), c’est une bonne alternative: Oldschool PC Fonts . En prime, ces supports prennent en charge les scripts étendus en latin, grec, cyrillique et hébreu, ainsi que plusieurs glyphes et symboles Unicode supplémentaires.

1
datatype_void

Il est peu probable que vous puissiez y parvenir avec un simple outil gratuit. http://www.fontlab.com ont des outils pour le faire, mais ils sont très chers.

1
Strelok

La traçage automatique ne fonctionnant pas, j’ai donc écrit Un script python pour tracer des images en noir et blanc en polygones vectoriels, un par pixel.

Donc, avec un dossier d’images de glyphes, vous pouvez le convertir en un dossier de fichiers svg.

Ensuite, dans Inkscape union +, simplifiez le chemin pour nettoyer chaque glyphe. (peut être faisable en ligne de commande avec Inkscape)

Enfin, importez la svg correspondante dans FontForge pour chaque glyphe.

-> script hébergé sur 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 __== '__main__':
    main()
0
Zv_oDD