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.

qp6c7.png

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.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值