PIL cómo escalar el tamaño del texto en relación con el tamaño de la imagen

Estoy tratando de escalar dinámicamente el texto para colocarlo en imágenes de dimensiones diferentes pero conocidas. El texto se aplicará como marca de agua. ¿Hay alguna forma de escalar el texto en relación con las dimensiones de la imagen? No requiero que el texto ocupe toda el área de la superficie, solo para que sea lo suficientemente visible como para que sea fácilmente identificable y difícil de eliminar. Estoy usando Python Imaging Library versión 1.1.7. en linux

Me gustaría poder establecer la relación entre el tamaño del texto y las dimensiones de la imagen, por ejemplo, como 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 he tenido 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

Usted podría simplemente boost 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 representado.

 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, puede implementar un esquema de búsqueda de raíces, pero supongo que la función font.getsize() es una papa pequeña en comparación con el rest de sus procesos de edición de imágenes.

En general, cuando cambia el tamaño de la fuente, no será un cambio lineal en el tamaño de la fuente.

Escalado no lineal

Ahora, esto a menudo depende del software, las fonts, etc. Este ejemplo fue tomado de Typophile y usa la fuente LaTex + Computer Modern. Como se puede ver, no es exactamente una escala lineal. Entonces, si tiene problemas con la escala de fuente no lineal, entonces no estoy seguro de cómo resolverlo, pero tal vez una sugerencia es hacerlo.

  1. Procese la fuente tan cerca del tamaño que desee, luego amplíela hacia arriba / abajo a través del algoritmo de escalamiento de imagen regular …
  2. Simplemente acepte que no será exactamente una escala lineal e intente 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.