├── LICENSE ├── README.chinese.md ├── README.hindi.md ├── README.md ├── README.portuguese.md ├── README.ru.md ├── animations ├── filin.gif └── gif.gif ├── img_to_txt.py ├── img_to_txt_rus.py ├── pictures ├── png.png ├── py.png ├── superman.jpg └── temp.png ├── requirements.txt ├── texts └── out.txt ├── video_to_txt.py └── video_to_txt_rus.py /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Andrej Marinchenko 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.chinese.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

13 | 14 | 15 | # 将图像转换为 .txt 文件 16 | Read in other languages: [English](README.md), [हिन्दी](README.hindi.md), [Português](README.portuguese.md), [Русский](README.ru.md) 17 | 18 | ## 怎么运行的? 19 | 20 | 一切都很简单:你要么下载一个图片文件,要么在运行 python 脚本时指定它的链接,然后 21 | 输出你得到一个文本文件,你可以立即在命令行上查看它的外观 22 | 你转换的结果。 23 | 24 | ## 准备和使用机器人的程序 25 | 26 | * 克隆存储库或从 github 下载存档或在命令行上使用以下命令 27 | 28 | ```commandline 29 | $ cmd 30 | $ git clone https://github.com/BEPb/image_to_ascii 31 | $ cd image_to_ascii 32 | ``` 33 | 34 | ### 应用存储库 35 | * 从文件安装依赖项,为此,在命令行中输入以下代码: 36 | 37 | ```shell 38 | $ pip3 install -r requirements.txt 39 | ```` 40 | 41 | * 程序启动的一般形式: 42 | 43 | ```shell 44 | $ python3 img_to_txt_rus.py [file/url] [size] 45 | ``` 46 | 47 | *参数: 48 | 49 | ```shell 50 | [file/url]:本地文件路径或在线图片URL。 51 | [size]:输出txt图片的字符宽度——整数,size越大图片越清晰。 52 | ``` 53 | 54 | ### 例子 55 | ```shell 56 | $ python3 img_to_txt.py https://i.postimg.cc/t4Cmn7wC/py.png 57 | ``` 58 | 通过执行此命令,您将在当前“文本”文件夹中获得一个名为“out.txt”的文件,您将在控制台中看到该行的输出: 59 | 60 | Bot logo 61 | 62 | Bot logo 63 | 64 | 65 | ## 视频到文本转换器 66 | 原理类似,只是生成的文本文件不存在。 67 | 68 | ```commandline 69 | cd C:\Users\root\PycharmProjects\image_to_ascii 70 | python video_to_txt.py animations\filin.gif 150 71 | ``` 72 | 73 | Bot logo 74 | 75 | Bot logo 76 | 77 | 78 | 79 | ### License 80 | [MIT licence](LICENSE) 81 | -------------------------------------------------------------------------------- /README.hindi.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

13 | 14 | 15 | # एक छवि को एक .txt फ़ाइल में कनवर्ट करना 16 | Read in other languages: [English](README.md), [Русский](README.ru.md), [中國人](README.chinese.md), [Português](README.portuguese.md) 17 | 18 | ## यह काम किस प्रकार करता है? 19 | 20 | सब कुछ बहुत सरल है: आप या तो चित्र फ़ाइल डाउनलोड करते हैं या पायथन स्क्रिप्ट चलाते समय इसका लिंक निर्दिष्ट करते हैं, और 21 | आउटपुट आपको एक टेक्स्ट फ़ाइल मिलती है, और आप तुरंत कमांड लाइन पर देख सकते हैं कि यह कैसा दिखेगा 22 | आपके रूपांतरण का परिणाम। 23 | 24 | ## बॉट तैयार करने और उसके साथ काम करने की प्रक्रिया 25 | 26 | * रिपॉजिटरी को क्लोन करें या जीथब से आर्काइव डाउनलोड करें या कमांड लाइन पर निम्न कमांड का उपयोग करें 27 | 28 | ```commandline 29 | $ cmd 30 | $ git clone https://github.com/BEPb/image_to_ascii 31 | $ cd image_to_ascii 32 | ``` 33 | 34 | ### रिपॉजिटरी को लागू करना 35 | * एक फ़ाइल से निर्भरताएँ स्थापित करें, इसके लिए कमांड लाइन में निम्न कोड दर्ज करें: 36 | 37 | ```shell 38 | $ pip3 install -r requirements.txt 39 | ```` 40 | 41 | * प्रोग्राम लॉन्च का सामान्य रूप: 42 | 43 | ```shell 44 | $ python3 img_to_txt_rus.py [file/url] [size] 45 | ``` 46 | 47 | * तर्क: 48 | 49 | ```shell 50 | [file/url]: स्थानीय फ़ाइल पथ या ऑनलाइन छवि URL। 51 | [size]: वर्णों में आउटपुट txt छवि की चौड़ाई - एक पूर्णांक, आकार जितना बड़ा होगा, चित्र उतना ही स्पष्ट होगा। 52 | ``` 53 | 54 | ### उदाहरण 55 | ```shell 56 | $ python3 img_to_txt.py https://i.postimg.cc/t4Cmn7wC/py.png 57 | ``` 58 | इस कमांड को क्रियान्वित करने पर, आपको वर्तमान 'टेक्स्ट' फोल्डर में `out.txt` नाम की एक फाइल मिलेगी और आप कंसोल में लाइन का आउटपुट देखेंगे: 59 | 60 | 61 | Bot logo 62 | 63 | Bot logo 64 | 65 | 66 | ## वीडियो से टेक्स्ट कन्वर्टर 67 | सिद्धांत समान है, सिवाय इसके कि परिणामी पाठ फ़ाइल मौजूद नहीं है। 68 | 69 | ```commandline 70 | cd C:\Users\root\PycharmProjects\image_to_ascii 71 | python video_to_txt.py animations\filin.gif 150 72 | ``` 73 | 74 | Bot logo 75 | 76 | Bot logo 77 | 78 | 79 | 80 | ### License 81 | [MIT licence](LICENSE) 82 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

13 | 14 | 15 | # Converting an image to a .txt file 16 | Read in other languages: [Русский](README.ru.md), [हिन्दी](README.hindi.md), [中國人](README.chinese.md), [Português](README.portuguese.md) 17 | 18 | ## How it works? 19 | 20 | Everything is very simple: you either download a picture file or specify its link when running a python script, and 21 | output you get a text file, and you can immediately view on the command line how it will look 22 | the result of your conversion. 23 | 24 | ## Procedure for preparing and working with the bot 25 | 26 | * Clone the repository or download the archive from github or using the following commands on the command line 27 | 28 | ```commandline 29 | $ cmd 30 | $ git clone https://github.com/BEPb/image_to_ascii 31 | $ cd image_to_ascii 32 | ``` 33 | 34 | ### Applying the repository 35 | * Install dependencies from a file, for this, enter the following code in the command line: 36 | 37 | ```shell 38 | $ pip3 install -r requirements.txt 39 | ```` 40 | 41 | * general form of program launch: 42 | 43 | ```shell 44 | $ python3 img_to_txt_rus.py [file/url] [size] 45 | ``` 46 | 47 | * arguments: 48 | 49 | ```shell 50 | [file/url]: Local file path or online image URL. 51 | [size]: The width of the output txt image in characters - an integer, The larger the size, the clearer the picture. 52 | ``` 53 | 54 | ### Example 55 | ```shell 56 | $ python3 img_to_txt.py https://i.postimg.cc/t4Cmn7wC/py.png 57 | ``` 58 | By executing this command, you will get a file in the current 'texts' folder named `out.txt` and you will see the output of the line in the console: 59 | 60 | 61 | Bot logo 62 | 63 | Bot logo 64 | 65 | 66 | ## Video to Text Converter 67 | The principle is similar, except that the resulting text file does not exist. 68 | 69 | ```commandline 70 | cd C:\Users\root\PycharmProjects\image_to_ascii 71 | python video_to_txt.py animations\filin.gif 150 72 | ``` 73 | 74 | Bot logo 75 | 76 | Bot logo 77 | 78 | 79 | 80 | ### License 81 | [MIT licence](LICENSE) 82 | -------------------------------------------------------------------------------- /README.portuguese.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

13 | 14 | 15 | # Convertendo uma imagem para um arquivo de texto 16 | Leia em outros idiomas: [Русский](README.ru.md), [हिन्दी](README.hindi.md), [中國人](README.chinese.md), [English](README.md) 17 | 18 | ## Como funciona 19 | 20 | Tudo é muito simples: você baixa um arquivo de imagem ou especifica seu link ao executar um script python e 21 | saída, você obtém um arquivo de texto e pode visualizar imediatamente na linha de comando como ele ficará 22 | o resultado da sua conversão. 23 | 24 | ## Processo para preparar e trabalhar com o bot 25 | 26 | * Clone o repositório ou baixe o arquivo do GitHub ou use os seguintes comandos na linha de comando 27 | 28 | ```commandline 29 | $ cmd 30 | $ git clone https://github.com/BEPb/image_to_ascii 31 | $ cd image_to_ascii 32 | ``` 33 | 34 | ### Aplicando o repositório 35 | * Instale as dependências de um arquivo, para isto, insira o seguinte código na linha de comando: 36 | 37 | ```shell 38 | $ pip3 install -r requirements.txt 39 | ```` 40 | 41 | * Meio geral de inicializar o programa 42 | 43 | ```shell 44 | $ python3 img_to_txt_rus.py [file/url] [size] 45 | ``` 46 | 47 | * Argumentos: 48 | 49 | ```shell 50 | [file/url]: Arquivo local ou uma URL de imagem online. 51 | [size]: A largura do texto de saída em caracteres - um número inteiro, Quanto maior o tamanho, mais clara a imagem. 52 | ``` 53 | 54 | ### Exemplo 55 | ```shell 56 | $ python3 img_to_txt.py https://i.postimg.cc/t4Cmn7wC/py.png 57 | ``` 58 | 59 | Ao executar este comando, você receberá um arquivo na atual pasta 'texts' chamado `out.txt` e você verá a saída no console: 60 | 61 | 62 | Bot logo 63 | 64 | Bot logo 65 | 66 | 67 | ## Conversor de vído para texto 68 | O princípio é similar, exceto que o arquivo de texto resultante não existe. 69 | 70 | ```commandline 71 | cd C:\Users\root\PycharmProjects\image_to_ascii 72 | python video_to_txt.py animations\filin.gif 150 73 | ``` 74 | 75 | Bot logo 76 | 77 | Bot logo 78 | 79 | 80 | 81 | ### Licença 82 | [Licença MIT](LICENSE) -------------------------------------------------------------------------------- /README.ru.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

13 | 14 | 15 | # Преобразования изображения в txt-файл 16 | Читать на других языках: [English](README.md), [हिन्दी](README.hindi.md), [中國人](README.chinese.md), [Português](README.portuguese.md) 17 | 18 | 19 | ## Как это работает? 20 | 21 | Все очень просто: вы либо скачиваете файл-картинку или указываете ее ссылку при запуске скрипта на питоне, а на 22 | выходе получаете текстовый файл, а также сразу сможете просмотреть в командной строке как это будет выглядесть 23 | результат Вашего преобразования. 24 | 25 | ## Порядок подготовки и работы с ботом 26 | 27 | * Клонировать репозиторий либо скачать архив из github или при помощи следующих команд в командной строке 28 | ```commandline 29 | $ cmd 30 | $ git clone https://github.com/BEPb/image_to_ascii 31 | $ cd image_to_ascii 32 | ``` 33 | 34 | 35 | ### Применение репозитория 36 | * Устанавливаем зависимости из файла, для этого в командной строке введите следующий код: 37 | 38 | ```shell 39 | $ pip3 install -r requirements.txt 40 | ```` 41 | 42 | * общая форма запуска программы: 43 | 44 | ```shell 45 | $ python3 img_to_txt_rus.py [file/url] [size] 46 | ``` 47 | 48 | * аргументы: 49 | 50 | ```shell 51 | [file/url]: Путь к локальному файлу или URL-адрес онлайн-изображения. 52 | [size]: Ширина вывода txt изображения в символах - целое число, Чем больше размер, тем четче картинка . 53 | ``` 54 | 55 | ### Пример 56 | ```shell 57 | $ python3 img_to_txt_rus.py https://i.postimg.cc/t4Cmn7wC/py.png 58 | ``` 59 | Выполнив эту команду, вы получите файл в текущей папке 'texts' с именем `out.txt`, и вы увидите вывод строки в консоли: 60 | 61 | Bot logo 62 | 63 | Bot logo 64 | 65 | 66 | ## Программа преобразования видео в текст 67 | Принцип аналагичный, за исключением того, что итогового текстового файла не существует 68 | 69 | ```commandline 70 | cd C:\Users\root\PycharmProjects\image_to_ascii # переходим в дирректорию со скриптом 71 | python video_to_txt_rus.py animations\filin.gif 150 # запускаем скрипт 72 | ``` 73 | 74 | Bot logo 75 | 76 | Bot logo 77 | 78 | 79 | 80 | ### Лицензия 81 | [MIT licence](LICENSE) 82 | -------------------------------------------------------------------------------- /animations/filin.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BEPb/image_to_ascii/874ab21a88cb946e194add62fb8d4878978b573e/animations/filin.gif -------------------------------------------------------------------------------- /animations/gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BEPb/image_to_ascii/874ab21a88cb946e194add62fb8d4878978b573e/animations/gif.gif -------------------------------------------------------------------------------- /img_to_txt.py: -------------------------------------------------------------------------------- 1 | """ 2 | Python 3.10 image to text conversion program 3 | The image can be downloaded both from a file and from the Internet. 4 | File name img_to_txt_rus.py 5 | 6 | Version: 0.1 7 | Author: Andrej Marinchenko 8 | Date: 2023-02-11 9 | """ 10 | 11 | from PIL import Image 12 | import numpy as np 13 | import requests 14 | import sys 15 | 16 | txt_file = f'texts/out.txt' 17 | # img_file = ['-', f'pictures/superman.jpg', 90] 18 | img_file = ['-', f'pictures/py.jpg', 80] 19 | 20 | abc = '##@@MMBB88NNHHOOGGPPEEXXFFVVYY22ZZCC77LLjjll11rrii;;;:::.... ' 21 | l = 256 / len(abc) 22 | 23 | 24 | def remove_transparency(im, bg_colour=(255, 255, 255)): 25 | if im.mode in ('RGBA', 'LA') or (im.mode == 'P' and 'transparency' in im.info): 26 | alpha = im.convert('RGBA').split()[-1] 27 | bg = Image.new("RGBA", im.size, bg_colour + (255,)) 28 | bg.paste(im, mask=alpha) 29 | return bg 30 | else: 31 | return im 32 | 33 | def pixel_to_black(fp, weight): 34 | try: 35 | img = Image.open(fp) 36 | except: 37 | print('Please enter the correct path or image URL.') 38 | return 39 | img = remove_transparency(img) 40 | img = img.convert("L") 41 | im_w, im_h = img.size 42 | img = np.array(img) 43 | h, w = img.shape 44 | weight_w = weight if w >= weight else w 45 | weight_h = weight if h >= weight else h 46 | weight = weight_w if weight_w < weight_h else weight_h 47 | t_w = weight 48 | t_h = weight / (im_w / im_h) / 2 49 | width_times = int(w / t_w) if int(w / t_w) != 0 else 1 50 | high_times = int(h / t_h) if int(h / t_h) != 0 else 1 51 | tmp_high = [] 52 | for high_index in range(int(h / high_times)): 53 | tmp_width = [] 54 | for width_index in range(int(w / width_times)): 55 | tmp_block = [] 56 | for y in range((high_index * high_times), ((high_index + 1) * high_times)): 57 | for x in range(width_index * width_times, (width_index + 1) * width_times): 58 | tmp_block.append(img[y, x]) 59 | avg_tmp_block = sum(tmp_block) / len(tmp_block) 60 | tmp_width.append(avg_tmp_block) 61 | tmp_high.append(tmp_width) 62 | return tmp_high 63 | 64 | def black_to_alphabet(rgb_list): 65 | tmp_high = '' 66 | for i in rgb_list: 67 | tmp_width = '' 68 | for ii in i: 69 | a = abc[int(ii / l)] 70 | tmp_width += a 71 | tmp_width += '\n' 72 | tmp_high += tmp_width 73 | return tmp_high 74 | 75 | def paint(uri, weight): 76 | if uri.startswith('http'): 77 | img = get_img(uri) 78 | else: 79 | img = uri 80 | rgb_list = pixel_to_black(img, weight) 81 | if not rgb_list: 82 | return 83 | s = black_to_alphabet(rgb_list) 84 | with open(txt_file, 'w', encoding='utf-8') as f: 85 | f.write(s) 86 | return s 87 | 88 | def get_img(url): 89 | response = requests.get(url) 90 | if response.status_code == 200: 91 | with open(f'pictures/temp.png', 'wb') as f: 92 | for chunk in response.iter_content(1024): 93 | f.write(chunk) 94 | return f'pictures/temp.png' 95 | 96 | def main(args): 97 | try: 98 | uri = args[1] 99 | assert type(uri) == str 100 | except: 101 | uri = 'https://i.postimg.cc/t4Cmn7wC/py.png' 102 | try: 103 | weight = int(args[2]) 104 | assert type(weight) == int 105 | except: 106 | weight = 80 107 | s = paint(uri, weight=weight) 108 | if not s: 109 | return 110 | print(s) 111 | 112 | if __name__ == '__main__': 113 | main(sys.argv) 114 | # main(img_file) -------------------------------------------------------------------------------- /img_to_txt_rus.py: -------------------------------------------------------------------------------- 1 | """ 2 | Python 3.10 программа преобразования картинки в текст 3 | Картинку можно загрузить как из файла так и из интернета 4 | Название файла img_to_txt_rus.py 5 | 6 | Version: 0.1 7 | Author: Andrej Marinchenko 8 | Date: 2023-02-11 9 | """ 10 | 11 | from PIL import Image 12 | import numpy as np 13 | import requests 14 | import sys 15 | 16 | txt_file = f'texts/out.txt' 17 | # img_file = ['-', f'pictures/superman.jpg', 90] # указываем адрес файла изображения для обработки и его конечный размер 18 | img_file = ['-', f'pictures/py.jpg', 80] # указываем адрес файла изображения для обработки и его конечный размер 19 | 20 | abc = '##@@MMBB88NNHHOOGGPPEEXXFFVVYY22ZZCC77LLjjll11rrii;;;:::.... ' 21 | l = 256 / len(abc) 22 | 23 | # функция определяет тип изображения 24 | def remove_transparency(im, bg_colour=(255, 255, 255)): 25 | # Обрабатывать только в том случае, если изображение имеет прозрачность 26 | if im.mode in ('RGBA', 'LA') or (im.mode == 'P' and 'transparency' in im.info): 27 | 28 | # Необходимо преобразовать в RGBA, если формат LA из-за ошибки в PIL 29 | alpha = im.convert('RGBA').split()[-1] 30 | 31 | # Создайте новое фоновое изображение нашего матового цвета. 32 | # Должен быть RGBA, потому что вставка требует, чтобы оба изображения имели одинаковый формат 33 | bg = Image.new("RGBA", im.size, bg_colour + (255,)) 34 | bg.paste(im, mask=alpha) 35 | return bg 36 | else: 37 | return im 38 | 39 | # преобразование картинки 40 | def pixel_to_black(fp, weight): 41 | try: 42 | img = Image.open(fp) 43 | except: 44 | print('Введите правильный путь или URL изображения, пожалуйста.') 45 | return 46 | img = remove_transparency(img) 47 | img = img.convert("L") 48 | im_w, im_h = img.size 49 | img = np.array(img) 50 | h, w = img.shape 51 | # ширина 52 | weight_w = weight if w >= weight else w 53 | weight_h = weight if h >= weight else h 54 | weight = weight_w if weight_w < weight_h else weight_h 55 | # Максимальная ширина символа 56 | t_w = weight 57 | # Максимальная высота символов 58 | t_h = weight / (im_w / im_h) / 2 59 | width_times = int(w / t_w) if int(w / t_w) != 0 else 1 60 | high_times = int(h / t_h) if int(h / t_h) != 0 else 1 61 | 62 | tmp_high = [] 63 | for high_index in range(int(h / high_times)): 64 | tmp_width = [] 65 | for width_index in range(int(w / width_times)): 66 | tmp_block = [] 67 | for y in range((high_index * high_times), ((high_index + 1) * high_times)): 68 | for x in range(width_index * width_times, (width_index + 1) * width_times): 69 | tmp_block.append(img[y, x]) 70 | avg_tmp_block = sum(tmp_block) / len(tmp_block) 71 | tmp_width.append(avg_tmp_block) 72 | tmp_high.append(tmp_width) 73 | return tmp_high 74 | 75 | 76 | def black_to_alphabet(rgb_list): 77 | tmp_high = '' 78 | for i in rgb_list: 79 | tmp_width = '' 80 | for ii in i: 81 | a = abc[int(ii / l)] 82 | tmp_width += a 83 | tmp_width += '\n' 84 | tmp_high += tmp_width 85 | return tmp_high 86 | 87 | # функция преобразования изображения в текст 88 | def paint(uri, weight): 89 | if uri.startswith('http'): # если указана ссылка в интернете, то скачиваем изображение 90 | print('Распознана ссылка') 91 | img = get_img(uri) 92 | else: # иначе указана ссылка на локальное изображение (файл) 93 | print('Распознан файл') 94 | img = uri 95 | rgb_list = pixel_to_black(img, weight) 96 | if not rgb_list: 97 | return 98 | s = black_to_alphabet(rgb_list) 99 | with open(txt_file, 'w', encoding='utf-8') as f: 100 | f.write(s) 101 | return s 102 | 103 | # функция взятия изображения 104 | def get_img(url): 105 | print('Загрузка изображения из Интернета, пожалуйста, подождите.') 106 | response = requests.get(url) 107 | if response.status_code == 200: 108 | with open(f'pictures/temp.png', 'wb') as f: 109 | for chunk in response.iter_content(1024): 110 | f.write(chunk) 111 | return f'pictures/temp.png' 112 | 113 | '''Главная функция''' 114 | def main(args): # функция принимает аргументы 115 | try: 116 | print('Ваша ссылка принята') 117 | uri = args[1] 118 | assert type(uri) == str 119 | except: 120 | # изображение по умолчанию, в случае если не задано иное 121 | print('Вы не указали ссылку на скачивание, по этой причине будет загружено изображение по умолчанию...') 122 | uri = 'https://i.postimg.cc/t4Cmn7wC/py.png' 123 | try: 124 | weight = int(args[2]) # второй аргумент, это ширина изображения текста в символах 125 | assert type(weight) == int # проверяем что заданное число - целое 126 | except: 127 | weight = 80 # если ширина не задана, то по умолчанию 80 символов 128 | s = paint(uri, weight=weight) 129 | if not s: 130 | return 131 | print(s) # печать в командной строке преобразованного изображения в текст 132 | 133 | # проверка на главную программу и запуск главной функции 134 | if __name__ == '__main__': 135 | main(sys.argv) # запускаем главную функцию с аргументами при запуске программы 136 | # main(img_file) # запускаем главную функцию с картинкой из папки 137 | -------------------------------------------------------------------------------- /pictures/png.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BEPb/image_to_ascii/874ab21a88cb946e194add62fb8d4878978b573e/pictures/png.png -------------------------------------------------------------------------------- /pictures/py.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BEPb/image_to_ascii/874ab21a88cb946e194add62fb8d4878978b573e/pictures/py.png -------------------------------------------------------------------------------- /pictures/superman.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BEPb/image_to_ascii/874ab21a88cb946e194add62fb8d4878978b573e/pictures/superman.jpg -------------------------------------------------------------------------------- /pictures/temp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BEPb/image_to_ascii/874ab21a88cb946e194add62fb8d4878978b573e/pictures/temp.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BEPb/image_to_ascii/874ab21a88cb946e194add62fb8d4878978b573e/requirements.txt -------------------------------------------------------------------------------- /texts/out.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | .iljjjjjjjjjlr: 11 | rYXXXXXXXXXXXXXXXVj. 12 | ZX7:.;YXXXXXXXXXXXXXY. 13 | 1XXr ZXXXXXXXXXXXXXXC 14 | LXXXY2FXXXXXXXXXXXXXXXY 15 | r7777777777YXXXXXXXXXXY 16 | ijC2222222222222222VXXXXXXXXXXY :::::.. 17 | lFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXY ;iiiiii;. 18 | 7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXC iiiiiiiii; 19 | :XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXY.:iiiiiiiiii. 20 | ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYl.:iiiiiiiiiii: 21 | ;XXXXXXXXXXXXXXX27jlllllllll1i:.:iiiiiiiiiiiii: 22 | ;XXXXXXXXXXXXYr.::;;;;;;;;;;;iiiiiiiiiiiiiiiii: 23 | ;XXXXXXXXXXXl.;iiiiiiiiiiiiiiiiiiiiiiiiiiiiiii: 24 | .VXXXXXXXXXL ;iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii. 25 | :YXXXXXXXX::iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii: 26 | rZFXXXXX.:iiiiiiiiiiiiiiiiiiiiiiiiiiiiii:. 27 | .:;;; :iiiiiiiiii;.................. 28 | :iiiiiiiiiiiiiiiiiiiii; 29 | :iiiiiiiiiiiiiii:..;ii; 30 | .iiiiiiiiiiiiii; ii: 31 | .iiiiiiiiiiiiii;::;i: 32 | .;iiiiiiiiiiiii;:. 33 | ......... 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /video_to_txt.py: -------------------------------------------------------------------------------- 1 | """ 2 | Python 3.10 программа преобразования видео в текст 3 | видео можно загрузить как из файла так и из интернета 4 | Название файла video_to_txt.py 5 | 6 | Version: 0.1 7 | Author: Andrej Marinchenko 8 | Date: 2023-02-11 9 | """ 10 | import cv2 11 | from PIL import Image 12 | import numpy as np 13 | import time 14 | import sys 15 | 16 | abc = '@MWNHB8$06XFVYZ27>1jli!;:,. ' 17 | l = 256 / len(abc) 18 | 19 | def remove_transparency(im, bg_colour=(255, 255, 255)): 20 | if im.mode in ('RGBA', 'LA') or (im.mode == 'P' and 'transparency' in im.info): 21 | alpha = im.convert('RGBA').split()[-1] 22 | bg = Image.new("RGBA", im.size, bg_colour + (255,)) 23 | bg.paste(im, mask=alpha) 24 | return bg 25 | 26 | else: 27 | return im 28 | 29 | def img2pixel(img, charwidth=100): 30 | img = img.convert("L") 31 | w, h = img.size 32 | img = img.resize((charwidth, int(charwidth * (h / w) / 2.4))) 33 | data = np.array(img) 34 | return data 35 | 36 | 37 | def pixel2char(data): 38 | chars = '\n\n' 39 | for row in data: 40 | for pixel in row: 41 | a = abc[int(pixel / l)] 42 | chars += a 43 | chars += '\n' 44 | return chars + '\n' 45 | 46 | 47 | def main(args): 48 | start = time.time() 49 | if len(args) != 3: 50 | return 51 | vcap = cv2.VideoCapture(args[1]) 52 | width = vcap.get(cv2.CAP_PROP_FRAME_WIDTH) # вещественное число 53 | height = vcap.get(cv2.CAP_PROP_FRAME_HEIGHT) # вещественное число 54 | fps = vcap.get(cv2.CAP_PROP_FPS) 55 | print(width, height, fps) 56 | 57 | currentframe = 0 58 | while (True): 59 | t1 = time.time() 60 | ret, frame = vcap.read() 61 | if ret: 62 | pilimg = Image.fromarray(frame) 63 | data = img2pixel(pilimg, charwidth=int(args[2])) 64 | s = pixel2char(data=data) 65 | print(s) 66 | currentframe += 1 67 | else: 68 | break 69 | 70 | time2sleep = (1 / fps) - (time.time() - t1) 71 | if time2sleep > 0: time.sleep(time2sleep) 72 | 73 | # Освободите пространство и окна 74 | vcap.release() 75 | cv2.destroyAllWindows() 76 | 77 | if __name__ == '__main__': 78 | main(sys.argv) 79 | -------------------------------------------------------------------------------- /video_to_txt_rus.py: -------------------------------------------------------------------------------- 1 | """ 2 | Python 3.10 программа преобразования видео в текст 3 | видео можно загрузить как из файла так и из интернета 4 | Название файла video_to_txt_rus.py 5 | 6 | Version: 0.1 7 | Author: Andrej Marinchenko 8 | Date: 2023-02-11 9 | """ 10 | import cv2 11 | from PIL import Image 12 | import numpy as np 13 | import time 14 | import sys 15 | 16 | abc = '@MWNHB8$06XFVYZ27>1jli!;:,. ' 17 | l = 256 / len(abc) 18 | 19 | 20 | def remove_transparency(im, bg_colour=(255, 255, 255)): 21 | if im.mode in ('RGBA', 'LA') or (im.mode == 'P' and 'transparency' in im.info): 22 | alpha = im.convert('RGBA').split()[-1] 23 | bg = Image.new("RGBA", im.size, bg_colour + (255,)) 24 | bg.paste(im, mask=alpha) 25 | return bg 26 | 27 | else: 28 | return im 29 | 30 | 31 | def img2pixel(img, charwidth=100): 32 | img = img.convert("L") 33 | w, h = img.size 34 | img = img.resize((charwidth, int(charwidth * (h / w) / 2.4))) 35 | data = np.array(img) 36 | return data 37 | 38 | 39 | def pixel2char(data): 40 | chars = '\n\n' 41 | for row in data: 42 | for pixel in row: 43 | a = abc[int(pixel / l)] 44 | chars += a 45 | chars += '\n' 46 | return chars + '\n' 47 | 48 | 49 | def main(args): 50 | start = time.time() 51 | if len(args) != 3: 52 | print("Использование: video_to_txt ширина символа видеопути") 53 | return 54 | 55 | # Получите информацию о ширине, высоте и частоте кадров видео 56 | vcap = cv2.VideoCapture(args[1]) 57 | width = vcap.get(cv2.CAP_PROP_FRAME_WIDTH) # вещественное число 58 | height = vcap.get(cv2.CAP_PROP_FRAME_HEIGHT) # вещественное число 59 | fps = vcap.get(cv2.CAP_PROP_FPS) 60 | print(width, height, fps) 61 | 62 | # начать цикл по кадрам 63 | currentframe = 0 64 | while (True): 65 | t1 = time.time() 66 | ret, frame = vcap.read() 67 | if ret: 68 | pilimg = Image.fromarray(frame) 69 | data = img2pixel(pilimg, charwidth=int(args[2])) 70 | s = pixel2char(data=data) 71 | print(s) 72 | currentframe += 1 73 | else: 74 | break 75 | 76 | # Время сна составляет одну долю секунды от кадров в секунду минус время, в течение которого этот кадр уже использовался. 77 | time2sleep = (1 / fps) - (time.time() - t1) 78 | if time2sleep > 0: time.sleep(time2sleep) 79 | 80 | # Освободите пространство и окна 81 | vcap.release() 82 | cv2.destroyAllWindows() 83 | print("Прошедшее время:", time.time() - start) 84 | 85 | 86 | if __name__ == '__main__': 87 | main(sys.argv) 88 | --------------------------------------------------------------------------------