texto numeros numero letras crear convertir como binarios binario archivos archivo python python-imaging-library imaging

numeros - Biblioteca de imágenes de Python-Representación de texto



convertir texto en numero en python (5)

Encontré mi propia solución que encuentro aceptable.

Lo que hice fue renderizar el texto grande, como 3 veces el tamaño que necesita para ser escalar y redimensionarlo con antialiasing, no es 100% perfecto, pero es muchísimo mejor que el predeterminado, y no requiere cairo o Pango.

por ejemplo,

image = Image.new("RGBA", (600,150), (255,255,255)) draw = ImageDraw.Draw(image) font = ImageFont.truetype("resources/HelveticaNeueLight.ttf", fontsize) draw.text((10, 0), txt, (0,0,0), font=font) img_resized = image.resize((188,45), Image.ANTIALIAS)

y terminas con este resultado,

que es mucho mejor de lo que estaba obteniendo con la misma fuente.

Estoy tratando de renderizar un poco de texto usando PIL, pero el resultado que sale es, francamente, una porquería.

Por ejemplo, aquí hay un texto que escribí en Photoshop:

y lo que sale de PIL:

Como puede ver, los resultados de PIL no son satisfactorios. Tal vez estoy siendo exigente, pero ¿hay alguna forma de dibujar texto usando PIL que obtenga resultados más cercanos a mi imagen de referencia?

Aquí está el código que estoy usando en Python 2.7 con PIL 1.1.7

image = Image.new("RGBA", (288,432), (255,255,255)) usr_font = ImageFont.truetype("resources/HelveticaNeueLight.ttf", 25) d_usr = ImageDraw.Draw(image) d_usr = d_usr.text((105,280), "Travis L.",(0,0,0), font=usr_font)


Nunca he usado PIL, pero una revisión rápida de la documentación del método Draw indica que PIL proporciona una forma de representar gráficos simples . Photoshop proporciona una forma de renderizar gráficos complejos . Acercarse a los resultados similares a Photoshop requiere, como mínimo, insinuación de fuente y antialiasing. La documentación de PIL ni siquiera insinúa tener tales capacidades. Es posible que desee ver el uso de una herramienta externa que podría hacer un mejor trabajo al renderizar texto en imágenes. Por ejemplo, ImageMagick (querrá usar la versión de 8 bits, que maneja RGB estándar de 24 bits). Puede encontrar algunos ejemplos de dibujo de texto aquí: http://www.imagemagick.org/Usage/draw/


Sugerencia: use Wand o una biblioteca de imágenes diferente

Aquí hay un ejemplo con varita:

from wand.color import Color from wand.image import Image from wand.drawing import Drawing from wand.compat import nested from math import cos, pi, sin with Drawing() as draw: with Image(width=1000, height=100, background=Color(''lightblue'')) as img: draw.font_family = ''Indie Flower'' draw.font_size = 40.0 draw.push() draw.fill_color = Color(''hsl(0%, 0%, 0%)'') draw.text(0,int(img.height/2 + 20), ''Hello, world!'') draw.pop() draw(img) img.save(filename=''image.png'')


También puede tratar de escribir la fuente dos veces, lo que aumenta la calidad inmensa.

image = Image.new("RGBA", (288,432), (255,255,255)) usr_font = ImageFont.truetype("resources/HelveticaNeueLight.ttf", 25) d_usr = ImageDraw.Draw(image) d_usr = d_usr.text((105,280), "Travis L.",(0,0,0), font=usr_font) d_usr = d_usr.text((105,280), "Travis L.",(0,0,0), font=usr_font)


Trate de usar pycairo - los enlaces de python para la biblioteca de dibujo de El Cairo - es útil para un dibujo más refinado, con líneas antialias, y tal - y también puede generar imágenes basadas en vectores.

El manejo correcto de las fuentes y el diseño es complicado, y también requiere el uso de las bibliotecas "pango" y "pangocairo". A pesar de que están hechos para el trabajo de fuentes serias (todos los widgets GTK + usan pango para la representación de fuentes), la instancia de doc y ejemplos disponibles son extremadamente pobres.

La muestra siguiente muestra las impresiones disponibles en el sistema y muestra el texto de muestra en una familia de fuentes como parámetro en la línea de comando.

# -*- coding: utf-8 -*- import cairo import pango import pangocairo import sys surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 320, 120) context = cairo.Context(surf) #draw a background rectangle: context.rectangle(0,0,320,120) context.set_source_rgb(1, 1, 1) context.fill() #get font families: font_map = pangocairo.cairo_font_map_get_default() families = font_map.list_families() # to see family names: print [f.get_name() for f in font_map.list_families()] #context.set_antialias(cairo.ANTIALIAS_SUBPIXEL) # Positions drawing origin so that the text desired top-let corner is at 0,0 context.translate(50,25) pangocairo_context = pangocairo.CairoContext(context) pangocairo_context.set_antialias(cairo.ANTIALIAS_SUBPIXEL) layout = pangocairo_context.create_layout() fontname = sys.argv[1] if len(sys.argv) >= 2 else "Sans" font = pango.FontDescription(fontname + " 25") layout.set_font_description(font) layout.set_text(u"Travis L.") context.set_source_rgb(0, 0, 0) pangocairo_context.update_layout(layout) pangocairo_context.show_layout(layout) with open("cairo_text.png", "wb") as image_file: surf.write_to_png(image_file)