negro matrices graficos graficar color python fonts image-manipulation python-imaging-library scaling

graficos - graficar matrices en python



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

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ácil de identificar y de identificar. 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, 1/10 del tamaño o algo así.

He estado buscando 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


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

Ahora, esto a menudo depende del software, las fuentes, 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.

Usted podría simplemente 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 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 resto de sus procesos de edición de imágenes.