Convertir un archivo .txt en una imagen en Python

Tengo un código que convierte una imagen en una imagen de arte ascii. Actualmente lo genera como un archivo .txt, pero el archivo puede tener varios cientos de miles de caracteres. ¿Cómo puedo convertir el archivo a una imagen como un archivo .png?

Actualmente construye un vector de caracteres basado en la densidad de píxeles, y luego escribe el vector en una imagen .txt.

Si entiendo correctamente, quieres una imagen que parezca que alguien tomó una captura de pantalla del arte ascii como se vería en un editor de texto gigante e ilimitado.

He hecho algo similar para generar texto programáticamente con PILLOW. Aquí hay un ejemplo modificado de este código mío. Espero que este código te ayude a ti ya otros a evitar el juego que tuve que hacer para descubrir cómo hacer que las cosas se vean razonables.

Aquí hay un ejemplo de resultado hecho a partir del código de abajo.

introduzca la descripción de la imagen aquí

El código es una modificación directa de la biblioteca vinculada para trabajar con un archivo de texto en lugar de una cadena.

import PIL import PIL.Image import PIL.ImageFont import PIL.ImageOps import PIL.ImageDraw PIXEL_ON = 0 # PIL color to use for "on" PIXEL_OFF = 255 # PIL color to use for "off" def main(): image = text_image('content.txt') image.show() image.save('content.png') def text_image(text_path, font_path=None): """Convert text file to a grayscale image with black characters on a white background. arguments: text_path - the content of this file will be converted to an image font_path - path to a font file (for example impact.ttf) """ grayscale = 'L' # parse the file into lines with open(text_path) as text_file: # can throw FileNotFoundError lines = tuple(l.rstrip() for l in text_file.readlines()) # choose a font (you can see more detail in my library on github) large_font = 20 # get better resolution with larger size font_path = font_path or 'cour.ttf' # Courier New. works in windows. linux may need more explicit path try: font = PIL.ImageFont.truetype(font_path, size=large_font) except IOError: font = PIL.ImageFont.load_default() print('Could not use chosen font. Using default.') # make the background image based on the combination of font and lines pt2px = lambda pt: int(round(pt * 96.0 / 72)) # convert points to pixels max_width_line = max(lines, key=lambda s: font.getsize(s)[0]) # max height is adjusted down because it's too large visually for spacing test_string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' max_height = pt2px(font.getsize(test_string)[1]) max_width = pt2px(font.getsize(max_width_line)[0]) height = max_height * len(lines) # perfect or a little oversized width = int(round(max_width + 40)) # a little oversized image = PIL.Image.new(grayscale, (width, height), color=PIXEL_OFF) draw = PIL.ImageDraw.Draw(image) # draw each line of text vertical_position = 5 horizontal_position = 5 line_spacing = int(round(max_height * 0.8)) # reduced spacing seems better for line in lines: draw.text((horizontal_position, vertical_position), line, fill=PIXEL_ON, font=font) vertical_position += line_spacing # crop the text c_box = PIL.ImageOps.invert(image).getbbox() image = image.crop(c_box) return image if __name__ == '__main__': main() 

Por cierto, todo ese código probablemente no debería estar relleno en una función, pero creo que lo hace más simple, por ejemplo, el código.

Echa un vistazo a Almohada (documentación aquí )

De la documentación enlazada arriba:

Aquí hay un ejemplo simple:

 import ImageFont, ImageDraw draw = ImageDraw.Draw(image) # use a bitmap font font = ImageFont.load("arial.pil") draw.text((10, 10), "hello", font=font) # use a truetype font font = ImageFont.truetype("arial.ttf", 15) draw.text((10, 25), "world", font=font)