python图片保存为txt文件,在Python中将.txt文件转换为图像

I have some code that converts an image into an ascii art image.

Currently it outputs it as a .txt file, but the file can have several hundred thousand characters. How can I convert the file to an image such as a .png file?

Currently it builds a character vector based on the pixel density, and then writes the vector into a .txt image.

解决方案

If I understand correctly, you want an image that looks as if someone took a screenshot of the ascii art as it would look in a giant unlimited text editor.

I have done something similar to generate text programmatically with PILLOW. Here is an example modified from this code of mine. Hopefully this code will help you and others avoid the fiddling I had to do to figure out how to make things look reasonable.

Here is an example result made from the code below.

The code is a straightforward modification of the linked library to work with a text file instead of a string.

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()

By the way, all that code should probably not be stuffed in one function, but I think it makes it more simple for example code.

你可能感兴趣的:(python图片保存为txt文件,在Python中将.txt文件转换为图像)