我正在做编程项目ASCII艺术在python。到目前为止,我设法将RGB元组转换为单个亮度数字。下一步是将数字转换为ASCII字符。我被困住了,因为我不知道下一步该做什么。我必须为每个数字选择ASCII字符,数字的范围在0,255。我想得到一些提示,我该如何做这件事。
这是我到目前为止的代码。
from PIL import Image
im = Image.open("IMG_3021.jpg")
#print(im.size)
#im.show()
def load_pixel():
im = Image.open("IMG_3021.jpg")
x = list(im.getdata())
pixel = [int(sum(i)/3) for i in x]
for i in iter(pixel):
print(i)
# return pixel
# for pixel in iter(x):
# x = sum(pixel)//3
# x = (x * len(pixel_ascii_map)) // 255
# ascii_val = pixel_ascii_map[x]
# print(ascii_val)
print(load_pixel())
from PIL import Image
pixel_ascii_map = "`^",:;Il!i~+_-?][}{1)(|\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$"
def load_pixel():
im = Image.open("IMG_3021.jpg")
x = list(im.getdata())
for pixel in iter(x):
x = sum(pixel) // 3 # integer division
ascii_val = pixel_ascii_map[x]
print(ascii_val)
注意你的ascii映射没有足够的长度(像素的范围是0-255)。因此,为了防止它,你可以重新调整x
的值,以保持在地图范围内:
from PIL import Image
pixel_ascii_map = "`^",:;Il!i~+_-?][}{1)(|\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$"
def load_pixel():
im = Image.open("IMG_3021.jpg")
x = list(im.getdata())
for pixel in iter(x):
x = sum(pixel) // 3 # integer division
x = (x * len(pixel_ascii_map)) // 255 # rescaling
ascii_val = pixel_ascii_map[x]
print(ascii_val)
注意,通过做sum(pixel) // 3
,你实际上是灰度化你的图像,所以你会失去任何颜色信息。