2015-04-20 4 views
4

У меня есть код, который преобразует изображение в изображение ascii art. В настоящее время он выводит его как .txt-файл, но файл может иметь несколько сотен тысяч символов. Как преобразовать файл в образ, например, файл .png?Преобразование файла .txt в изображение в Python

В настоящее время он создает вектор символов, основанный на плотности пикселей, а затем записывает вектор в изображение .txt.

+0

Чтобы уточнить, файл .txt - это искусство ascii, и вы хотите получить изображение (например, скриншот) текста? – nathancahill

+0

Да, точно. Я хочу вывести png, который выглядит как .txt-файл. –

+0

Я отправил ответ, основанный на том, что я сделал в прошлом. В будущем я рекомендую вам приложить больше усилий для создания [Минимального, полного и проверяемого примера] (http://stackoverflow.com/help/mcve). Я думаю, вы получите более теплый прием на свои вопросы и больше ответов, поскольку он показывает, что вы приложили некоторые усилия к этой проблеме. В этом случае, если вы не имеете никакого представления о коде, по крайней мере, вы должны предоставить образец ввода и описать, насколько лучше можете вывести нужный результат. – KobeJohn

ответ

0

Посмотрите Pillow (документация here)

Из вышеприведенного связанной документации:

Вот простой пример:

import ImageFont, ImageDraw 

draw = ImageDraw.Draw(image) 

# use a bitmap font 
font = ImageFont.load("arial.pil") 

draw.text((10, 10), "hello", font=font) 

# use a truetype font 
font = ImageFont.truetype("arial.ttf", 15) 

draw.text((10, 25), "world", font=font) 
+0

Как это даже приближается к ответу на вопрос? Во-первых, 'PIL' был мертв около 5 лет,' Pillow' был его заменой в течение длительного времени. Во-вторых, ваш код не сработает. B/c 'image' не определен. В-третьих, как это читает искусство ASCII и выводит '.png'? Это не так - он создает новый образ и пишет «привет мир» на нем, используя разные представления Arial. – MattDMo

+0

Я не использовал PIL какое-то время, поэтому не знал о его статусе или о том, что Pillow его превзошла - я обновил ответ, чтобы отразить это. – Raniz

+1

Вопрос был: «Как преобразовать файл в изображение, такое как .png-файл?» и я думаю, что указание на библиотеку, которая предоставляет средства для этого, является подходящим ответом. – Raniz

4

Если я правильно понимаю, вы хотите изображение, которое выглядит так, как будто кто-то сделал снимок экрана искусства ascii, поскольку он будет выглядеть в гигантском неограниченном тексте e Дитор.

Я сделал что-то похожее для генерации текста программно с подушкой. Вот пример, измененный с моего кода this. Надеюсь, этот код поможет вам и другим избежать возиться, что я должен был сделать, чтобы выяснить, как сделать вещи разумными.

Приведенный ниже пример приведен ниже.

enter image description here

Код является непосредственной модификацией подключенной библиотеки для работы с текстовым файлом, а не строки.

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

Кстати, все, что код должен, вероятно, не набивать в одной функции, но я думаю, что это делает его более простым для примера кода.

Смежные вопросы