Trong bài này, chúng ta muốn chuyển đổi một hình ảnh cho trước thành ảnh dựa trên văn bản, còn gọi là ảnh ASCII.
Dưới đây là chương trình Python nhận ảnh đầu vào và các hàm chuyển đổi thành ảnh xám (grayscale), sau đó áp dụng ký tự ASCII để tạo các mẫu khác nhau trong ảnh. Kết quả là ảnh dựa trên văn bản gồm chuỗi các ký tự ASCII thuần túy.
Ví dụ
from PIL import Image
import os
ASCII_CHARS = ['#', '?', '%', '.', 'S', '+', '.', '*', ':', ',', '@']
def resize_image(image, new_width=25):
(input_width, input_height) = image.size
aspect_ratio = input_height / float(input_width)
changed_height = int(aspect_ratio * new_width)
changed_image = image.resize((new_width, changed_height))
return changed_image
def make_grey(image):
return image.convert('L')
def pixel_to_ascii(image, range_width=25):
pixels_in_image = list(image.getdata())
pixels_to_chars = [ASCII_CHARS[pixel_value // range_width] for pixel_value in pixels_in_image]
return "".join(pixels_to_chars)
def image_to_ascii(image, new_width=25):
image = resize_image(image)
image = make_grey(image)
pixels_to_chars = pixel_to_ascii(image)
len_pixels_to_chars = len(pixels_to_chars)
image_ascii = [pixels_to_chars[index: index + new_width] for index in range(0, len_pixels_to_chars, new_width)]
return "\n".join(image_ascii)
def convert_image(image_filepath):
try:
image = Image.open(image_filepath)
except Exception as e:
print("Unable to open image file {image_filepath}.".format(image_filepath=image_filepath))
print(e)
return
image_ascii = image_to_ascii(image)
f = open(os.path.splitext(image_filepath)[0] + '.txt', 'w')
f.write(image_ascii)
f.close()
convert_image('D:\\button.jpg') Kết quả
Chạy mã trên cho kết quả sau:
Ảnh đầu vào

Ảnh đầu ra
