2009-12-27 7 views
5

que utilizan los dos métodos siguientes texto de la imagen de vista previa para generar un archivo de fuentes .ttfImageFont's getsize() no obtiene el tamaño de texto correcto?

método PIL:

def make_preview(text, fontfile, imagefile, fontsize=30): 
    try: 
     font = ImageFont.truetype(fontfile, fontsize) 
     text_width, text_height = font.getsize(text) 
     img = Image.new('RGBA', (text_width, text_height)) 
     draw = ImageDraw.Draw(img) 
     draw.text((0, 0), text, font=font, fill=(0, 0, 0)) 
     return True 
    except: 
     return False 

ImageMagick método:

def make_preview(text, fontfile, imagefile, fontsize=30): 
    p = subprocess.Popen(['convert', '-font', fontfile, '-background', 
      'transparent', '-gravity', 'center', '-pointsize', str(fontsize), 
      '-trim', '+repage', 'label:%s' % text, image_file]) 
    return p==0 

Ambos métodos cree imágenes de vista previa correctas la mayor parte del tiempo, pero en algunos casos raros (< 2%), el font.getsize (texto) simplemente cann para obtener el tamaño de texto correcto que da como resultado un texto desbordado proporcionado lienzo. ImageMagick tiene el mismo problema.

fuentes de muestra y las previsualizaciones:

HANFORD.TTF http://download.appfile.com/HANFORD.png

NEWTOW.TTF http://download.appfile.com/NEWTOW.png

MILF.TTF http://download.appfile.com/MILF.png

SWANSE.TTF http://download.appfile.com/SWANSE.png

He mirado en la documentación de ImageMagick y encontró la explicación de este problema en http://www.imagemagick.org/Usage/text/#overflow.

¿Es posible detectar dichos desbordamientos de texto y dibujar texto para que se ajuste al lienzo como esperábamos?

Respuesta

1

En este caso, simplemente especifique ImageMagick para usar un tamaño de lienzo más grande con un tamaño de fuente fijo y dibujará texto en el tamaño de punto especificado manteniendo su integridad.

def make_preview(text, fontfile, imagefile, fontsize=30): 
    p = subprocess.call(['convert', '-font', fontfile, '-background', 
     'transparent', '-gravity', 'center', '-size', '1500x300', 
     '-pointsize', str(fontsize), '-trim', '+repage', 'label:%s' % text, image_file]) 
    return p==0 

Si necesita ajustar el texto en lienzo especificada en lugar de utilizar un tamaño de punto fijo, es posible que necesite cambiar el tamaño de la imagen de salida después de que ha creado.

PIL no hace esto muy bien dibujando fuentes exóticas, sin importar el tamaño de punto que especifique para cargar una fuente, siempre desborda el texto fuera de la imagen de salida.

2

Tuve un problema similar una vez en PHP e ImageMagick.

Al final, resolví dibujando el texto en un lienzo muy grande, y luego recortándolo usando las funciones trim/auto-crop que reducen el espacio de la imagen.

Si entiendo correctamente su función de vista previa, en realidad ya está haciendo exactamente eso: debería ser suficiente para eliminar las configuraciones de ancho y alto.

+0

@Pekka, el método puede obras con IM pero creará grandes gastos generales, no sólo el recorte, sino también cambiar el tamaño de la imagen recortada para encajar en lienzo dimensión especificada. Esto no funciona con PIL. Siempre dibuja la mitad superior de las fuentes anteriores, incluso yo creo un lienzo más grande. – jack

+0

Trate de poner el comando "etiqueta" * antes de * los comandos de recorte y reparación, eso debería funcionar. La sobrecarga, no puedo ayudar. –

5

alt text http://img9.imageshack.us/img9/2419/fontfix.jpg

No es una solución de programación, pero cuando regenerar su problema, su sólo ocurre en sus fuentes (otras fuentes como Arial hay ningún problema en absoluto), por lo que han fijado sus ficheros (cambiando ascenso/métricas decentes).Puedes descargar here,

Y perdón por Hanford Script Font, no es perfecto como ves, la altura parece estar bien, pero el lado izquierdo no se dibuja, está fuera de mi entendimiento.

ACTUALIZACIÓN: En cuanto a Hanford Font, aquí es un trabajo alrededor, pasan espacio extra en el texto como "Handford escritura", y después recortar el espacio extra en la imagen como img=img.crop(img.getbbox())

alt text http://img64.imageshack.us/img64/1903/hanfordfontworkaround.jpg

Update2: tenía que pasar color = (255,255,255) en Image.New para obtener Texto negro sobre fondo blanco

img = Image.new('RGBA', (text_width, text_height),color=(255,255,255)) 

alt text http://img245.imageshack.us/img245/3462/colorblackh.jpg

+0

cómo modificar la métrica de ascenso/decente para una fuente especificada? ¿Es necesaria una nueva reubicación manual por fuente? – jack

+0

Utilicé fontforge para editar esas fuentes, jack. – YOU

+0

Debido a problemas de derechos de autor, creo que es mejor dejar la fuente tal como está y dibujar texto en un lienzo más grande y luego recortarlo. pero tu método funcionó para uso personal. Gracias por su consejo. – jack

Cuestiones relacionadas