17

Estoy intentando escalar dinámicamente el texto que se colocará en las imágenes de dimensiones variables pero conocidas. El texto se aplicará como una marca de agua. ¿Hay alguna forma de escalar el texto en relación con las dimensiones de la imagen? No es necesario que el texto abarque toda el área de la superficie, solo para ser lo suficientemente visible para que sea fácilmente identificable y difícil de eliminar. Estoy usando Python Imaging Library versión 1.1.7. en Linux.PIL cómo escalar el tamaño del texto en relación con el tamaño de la imagen

Me gustaría poder establecer la relación entre el tamaño del texto y las dimensiones de la imagen, digamos 1/10 del tamaño o algo así.

He estado buscando en el atributo de tamaño de fuente para cambiar el tamaño, pero no tuve la suerte de crear un algoritmo para escalarlo. Me pregunto si hay una mejor manera.

¿Alguna idea sobre cómo podría lograr esto?

Gracias

Respuesta

37

Puede aumentar el tamaño de la fuente hasta que encuentre un ajuste. font.getsize() es la función que le dice qué tan grande es el texto renderizado.

import ImageFont, ImageDraw, Image 

image = Image.open('hsvwheel.png') 
draw = ImageDraw.Draw(image) 
txt = "Hello World" 
fontsize = 1 # starting font size 

# portion of image width you want text width to be 
img_fraction = 0.50 

font = ImageFont.truetype("arial.ttf", fontsize) 
while font.getsize(txt)[0] < img_fraction*image.size[0]: 
    # iterate until the text size is just larger than the criteria 
    fontsize += 1 
    font = ImageFont.truetype("arial.ttf", fontsize) 

# optionally de-increment to be sure it is less than criteria 
fontsize -= 1 
font = ImageFont.truetype("arial.ttf", fontsize) 

print 'final font size',fontsize 
draw.text((10, 25), txt, font=font) # put the text on the image 
image.save('hsvwheel_txt.png') # save it 

Si esto no es lo suficientemente eficiente para usted, se puede implementar un esquema de búsqueda de raíz, pero supongo que la función font.getsize() es poca cosa en comparación con el resto de sus procesos de edición de imágenes.

+4

Hola Paul, ese fue el truco. Gracias por la ayuda – Shpongle

5

En general cuando se cambia el tipo de letra de tamaño que no va a ser un cambio lineal en el tamaño de la fuente.

Non-linear Scaling

Ahora bien, esto a menudo depende del software, fuentes, etc ... Este ejemplo fue tomado de Typophile y utiliza el látex + ordenador moderna fuente. Como puede ver, no es exactamente una escala lineal. Por lo tanto, si tiene problemas con el escalado de fuentes no lineales, no estoy seguro de cómo resolverlo, pero una sugerencia puede serlo.

  1. Representando la fuente como estrechamente con el tamaño que desee y, a continuación, escala que arriba/abajo a través de algoritmo de escalado de imagen normal ...
  2. simplemente aceptar que no va a ser exactamente la escala lineal y tratar de crear algún tipo de tabla/algoritmo que seleccionará el tamaño de punto más cercano para que la fuente coincida con el tamaño de la imagen.
+0

Gracias por la respuesta, el método sugerido por Paul lo resolvió. Gracias de todos modos. – Shpongle

+0

Mi primer pensamiento al mirar la imagen fue "bueno, si no se escala la altura de la línea con el texto, entonces, por supuesto, no va a parecer lineal". Pero al comparar la longitud de las líneas, puede ver que la longitud representada de la fuente de 6 puntos es más de la mitad de los 12 puntos, y los 5 puntos son más de la mitad de los 10 puntos. – Ian

Cuestiones relacionadas