PPM图像到Python中的ASCII艺术 [英] PPM image to ASCII art in Python
问题描述
我必须制作一个程序,该程序从命令行读取文件并将其转换为ASCII艺术。我使用的是PPM格式,这是
I have to make a program that reads in a file from the command line and covert it to ASCII art. I am using PPM format and here is a link to the project.
这是我到目前为止的内容:
Here is what I have so far:
import sys
def main(filename):
image = open(filename)
#reads through the first three lines
color = image.readline().splitlines()
size_width, size_height = image.readline().split()
max_color = image.readline().splitlines()
#reads the body of the file
pixels = image.read().split()
red = 0
green = 0
blue = 0
r_g_b_value = []
#pulls out the values of each tuple and coverts it to its grayscale value
for i in pixels:
if i != "\n" or " ":
if len(i) == 3:
red = int(i[0]) * .3
green = int(i[1]) * .59
blue = int(i[2]) * .11
elif len(i) == 2:
red == int(i[0]) * .3
green == int(i[1]) *.59
blue == 0
elif len(i) == 1:
red == int(i[0]) * .3
green == 0
blue == 0
r_g_b_value = [red + green + blue]
character = []
for j in len(r_g_b_value):
if int(j) <= 16:
character = " "
elif int(j) > 16 and int(j) <= 32:
character = "."
elif int(j) > 32 and int(j) <= 48:
character = ","
elif int(j) > 48 and int(j) <= 64:
charcter = ":"
elif int(j) > 64 and int(j) <= 80:
character = ";"
elif int(j) > 80 and int(j) <= 96:
character = "+"
elif int(j) > 96 and int(j) <= 112:
character = "="
elif int(j) > 112 and int(j) <= 128:
character = "o"
elif int(j) > 128 and int(j) <= 144:
character = "a"
elif int(j) > 144 and int(j) <= 160:
character = "e"
elif int(j) > 160 and int(j) <= 176:
character = "0"
elif int(j) > 176 and int(j) <= 192:
character = "$"
elif int(j) > 192 and int(j) <= 208:
character = "@"
elif int(j) > 208 and int(j) <= 224:
character = "A"
elif int(j) > 224 and int(j) <= 240:
character = "#"
else:
character = "M"
grayscale = character
print(grayscale)
main(sys.argv[1])
我收到一条错误消息,指出 int对象不可迭代,是否有简单的方法可以解决此问题,以及有人建议在保留图像的同时将其打印出来。
I an getting an error that says 'int' object is not iterable, is there is an easy way to fix this and how would someone recommend printing this out while preserving the image.
我不确定的最后一件事是如何保留图片的宽度和高度。
And the last thing I am unsure about is how to preserve the width and height of the picture.
任何帮助将不胜感激。
Any help would be greatly appreciated.
推荐答案
您可以使用 图片到ansi.py
进行转换。
You can use image-to-ansi.py
for the conversion.
首先,下载 image-to-ansi.py
:
wget https://gist.githubusercontent.com/klange/1687427/raw/image-to-ansi.py
将此脚本另存为 ppmimage.py
:
# Parses a PPM file and loads it into image-to-ansi.py
import re, itertools
sep = re.compile("[ \t\r\n]+")
def chunks(iterable,size):
""" http://stackoverflow.com/a/434314/309483 """
it = iter(iterable)
chunk = tuple(itertools.islice(it,size))
while chunk:
yield chunk
chunk = tuple(itertools.islice(it,size))
""" Emulates the Image class from PIL and some member functions (`getpixel`, `size`). """
class Image:
""" This class emulates the PIL Image class, and it can parse "plain" PPM's.
You can use PIL instead. """
@staticmethod
def fromstdin():
return Image()
def __init__(self): # http://netpbm.sourceforge.net/doc/ppm.html
self.entities = sep.split("\n".join(list(filter(lambda x: not x.startswith("#"), sys.stdin.read().strip().split("\n")))))
self.size = tuple(list(map(int,self.entities[1:3])))
self.high = int(self.entities[3]) # z.b. 255
self.pixels = list(map(lambda x: tuple(map(lambda y: int(int(y) / self.high * 255), x)), list(chunks(self.entities[4:], 3))))
def getpixel(self, tupl):
x = tupl[0]
y = tupl[1]
pix = self.pixels[y*self.size[0]+x]
return pix
image_to_ansi = __import__("image-to-ansi") # __import__ because of minuses in filename. From https://gist.github.com/1687427
if __name__ == '__main__':
import sys
#import Image
im = Image.fromstdin() # use Image.open from PIL if using PIL
for y in range(im.size[1]):
for x in range(im.size[0]):
p = im.getpixel((x,y))
h = "%2x%2x%2x" % (p[0],p[1],p[2])
short, rgb = image_to_ansi.rgb2short(h)
sys.stdout.write("\033[48;5;%sm " % short)
sys.stdout.write("\033[0m\n")
sys.stdout.write("\n")
您可以测试这样的脚本(假设您已安装 netpbm
和 imagemagick
):
You can test the script like this (this assumes you have netpbm
and imagemagick
installed):
convert -resize $(((COLUMNS * 2))x $(($ LINES * 2))logo:pnm:-| pnmtoplainpnm | python3 ppmimage.py
在我的机器上,它看起来像这样:
On my machine, it looks like this:
这篇关于PPM图像到Python中的ASCII艺术的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!