Repository: BEPb/image_to_ascii Branch: master Commit: 874ab21a88cb Files: 12 Total size: 28.8 KB Directory structure: gitextract_25iimfmq/ ├── LICENSE ├── README.chinese.md ├── README.hindi.md ├── README.md ├── README.portuguese.md ├── README.ru.md ├── img_to_txt.py ├── img_to_txt_rus.py ├── requirements.txt ├── texts/ │ └── out.txt ├── video_to_txt.py └── video_to_txt_rus.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2023 Andrej Marinchenko Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.chinese.md ================================================
## 视频到文本转换器
原理类似,只是生成的文本文件不存在。
```commandline
cd C:\Users\root\PycharmProjects\image_to_ascii
python video_to_txt.py animations\filin.gif 150
```
### License
[MIT licence](LICENSE)
================================================
FILE: README.hindi.md
================================================
## वीडियो से टेक्स्ट कन्वर्टर
सिद्धांत समान है, सिवाय इसके कि परिणामी पाठ फ़ाइल मौजूद नहीं है।
```commandline
cd C:\Users\root\PycharmProjects\image_to_ascii
python video_to_txt.py animations\filin.gif 150
```
### License
[MIT licence](LICENSE)
================================================
FILE: README.md
================================================
## Video to Text Converter
The principle is similar, except that the resulting text file does not exist.
```commandline
cd C:\Users\root\PycharmProjects\image_to_ascii
python video_to_txt.py animations\filin.gif 150
```
### License
[MIT licence](LICENSE)
================================================
FILE: README.portuguese.md
================================================
## Conversor de vído para texto
O princípio é similar, exceto que o arquivo de texto resultante não existe.
```commandline
cd C:\Users\root\PycharmProjects\image_to_ascii
python video_to_txt.py animations\filin.gif 150
```
### Licença
[Licença MIT](LICENSE)
================================================
FILE: README.ru.md
================================================
## Программа преобразования видео в текст
Принцип аналагичный, за исключением того, что итогового текстового файла не существует
```commandline
cd C:\Users\root\PycharmProjects\image_to_ascii # переходим в дирректорию со скриптом
python video_to_txt_rus.py animations\filin.gif 150 # запускаем скрипт
```
### Лицензия
[MIT licence](LICENSE)
================================================
FILE: img_to_txt.py
================================================
"""
Python 3.10 image to text conversion program
The image can be downloaded both from a file and from the Internet.
File name img_to_txt_rus.py
Version: 0.1
Author: Andrej Marinchenko
Date: 2023-02-11
"""
from PIL import Image
import numpy as np
import requests
import sys
txt_file = f'texts/out.txt'
# img_file = ['-', f'pictures/superman.jpg', 90]
img_file = ['-', f'pictures/py.jpg', 80]
abc = '##@@MMBB88NNHHOOGGPPEEXXFFVVYY22ZZCC77LLjjll11rrii;;;:::.... '
l = 256 / len(abc)
def remove_transparency(im, bg_colour=(255, 255, 255)):
if im.mode in ('RGBA', 'LA') or (im.mode == 'P' and 'transparency' in im.info):
alpha = im.convert('RGBA').split()[-1]
bg = Image.new("RGBA", im.size, bg_colour + (255,))
bg.paste(im, mask=alpha)
return bg
else:
return im
def pixel_to_black(fp, weight):
try:
img = Image.open(fp)
except:
print('Please enter the correct path or image URL.')
return
img = remove_transparency(img)
img = img.convert("L")
im_w, im_h = img.size
img = np.array(img)
h, w = img.shape
weight_w = weight if w >= weight else w
weight_h = weight if h >= weight else h
weight = weight_w if weight_w < weight_h else weight_h
t_w = weight
t_h = weight / (im_w / im_h) / 2
width_times = int(w / t_w) if int(w / t_w) != 0 else 1
high_times = int(h / t_h) if int(h / t_h) != 0 else 1
tmp_high = []
for high_index in range(int(h / high_times)):
tmp_width = []
for width_index in range(int(w / width_times)):
tmp_block = []
for y in range((high_index * high_times), ((high_index + 1) * high_times)):
for x in range(width_index * width_times, (width_index + 1) * width_times):
tmp_block.append(img[y, x])
avg_tmp_block = sum(tmp_block) / len(tmp_block)
tmp_width.append(avg_tmp_block)
tmp_high.append(tmp_width)
return tmp_high
def black_to_alphabet(rgb_list):
tmp_high = ''
for i in rgb_list:
tmp_width = ''
for ii in i:
a = abc[int(ii / l)]
tmp_width += a
tmp_width += '\n'
tmp_high += tmp_width
return tmp_high
def paint(uri, weight):
if uri.startswith('http'):
img = get_img(uri)
else:
img = uri
rgb_list = pixel_to_black(img, weight)
if not rgb_list:
return
s = black_to_alphabet(rgb_list)
with open(txt_file, 'w', encoding='utf-8') as f:
f.write(s)
return s
def get_img(url):
response = requests.get(url)
if response.status_code == 200:
with open(f'pictures/temp.png', 'wb') as f:
for chunk in response.iter_content(1024):
f.write(chunk)
return f'pictures/temp.png'
def main(args):
try:
uri = args[1]
assert type(uri) == str
except:
uri = 'https://i.postimg.cc/t4Cmn7wC/py.png'
try:
weight = int(args[2])
assert type(weight) == int
except:
weight = 80
s = paint(uri, weight=weight)
if not s:
return
print(s)
if __name__ == '__main__':
main(sys.argv)
# main(img_file)
================================================
FILE: img_to_txt_rus.py
================================================
"""
Python 3.10 программа преобразования картинки в текст
Картинку можно загрузить как из файла так и из интернета
Название файла img_to_txt_rus.py
Version: 0.1
Author: Andrej Marinchenko
Date: 2023-02-11
"""
from PIL import Image
import numpy as np
import requests
import sys
txt_file = f'texts/out.txt'
# img_file = ['-', f'pictures/superman.jpg', 90] # указываем адрес файла изображения для обработки и его конечный размер
img_file = ['-', f'pictures/py.jpg', 80] # указываем адрес файла изображения для обработки и его конечный размер
abc = '##@@MMBB88NNHHOOGGPPEEXXFFVVYY22ZZCC77LLjjll11rrii;;;:::.... '
l = 256 / len(abc)
# функция определяет тип изображения
def remove_transparency(im, bg_colour=(255, 255, 255)):
# Обрабатывать только в том случае, если изображение имеет прозрачность
if im.mode in ('RGBA', 'LA') or (im.mode == 'P' and 'transparency' in im.info):
# Необходимо преобразовать в RGBA, если формат LA из-за ошибки в PIL
alpha = im.convert('RGBA').split()[-1]
# Создайте новое фоновое изображение нашего матового цвета.
# Должен быть RGBA, потому что вставка требует, чтобы оба изображения имели одинаковый формат
bg = Image.new("RGBA", im.size, bg_colour + (255,))
bg.paste(im, mask=alpha)
return bg
else:
return im
# преобразование картинки
def pixel_to_black(fp, weight):
try:
img = Image.open(fp)
except:
print('Введите правильный путь или URL изображения, пожалуйста.')
return
img = remove_transparency(img)
img = img.convert("L")
im_w, im_h = img.size
img = np.array(img)
h, w = img.shape
# ширина
weight_w = weight if w >= weight else w
weight_h = weight if h >= weight else h
weight = weight_w if weight_w < weight_h else weight_h
# Максимальная ширина символа
t_w = weight
# Максимальная высота символов
t_h = weight / (im_w / im_h) / 2
width_times = int(w / t_w) if int(w / t_w) != 0 else 1
high_times = int(h / t_h) if int(h / t_h) != 0 else 1
tmp_high = []
for high_index in range(int(h / high_times)):
tmp_width = []
for width_index in range(int(w / width_times)):
tmp_block = []
for y in range((high_index * high_times), ((high_index + 1) * high_times)):
for x in range(width_index * width_times, (width_index + 1) * width_times):
tmp_block.append(img[y, x])
avg_tmp_block = sum(tmp_block) / len(tmp_block)
tmp_width.append(avg_tmp_block)
tmp_high.append(tmp_width)
return tmp_high
def black_to_alphabet(rgb_list):
tmp_high = ''
for i in rgb_list:
tmp_width = ''
for ii in i:
a = abc[int(ii / l)]
tmp_width += a
tmp_width += '\n'
tmp_high += tmp_width
return tmp_high
# функция преобразования изображения в текст
def paint(uri, weight):
if uri.startswith('http'): # если указана ссылка в интернете, то скачиваем изображение
print('Распознана ссылка')
img = get_img(uri)
else: # иначе указана ссылка на локальное изображение (файл)
print('Распознан файл')
img = uri
rgb_list = pixel_to_black(img, weight)
if not rgb_list:
return
s = black_to_alphabet(rgb_list)
with open(txt_file, 'w', encoding='utf-8') as f:
f.write(s)
return s
# функция взятия изображения
def get_img(url):
print('Загрузка изображения из Интернета, пожалуйста, подождите.')
response = requests.get(url)
if response.status_code == 200:
with open(f'pictures/temp.png', 'wb') as f:
for chunk in response.iter_content(1024):
f.write(chunk)
return f'pictures/temp.png'
'''Главная функция'''
def main(args): # функция принимает аргументы
try:
print('Ваша ссылка принята')
uri = args[1]
assert type(uri) == str
except:
# изображение по умолчанию, в случае если не задано иное
print('Вы не указали ссылку на скачивание, по этой причине будет загружено изображение по умолчанию...')
uri = 'https://i.postimg.cc/t4Cmn7wC/py.png'
try:
weight = int(args[2]) # второй аргумент, это ширина изображения текста в символах
assert type(weight) == int # проверяем что заданное число - целое
except:
weight = 80 # если ширина не задана, то по умолчанию 80 символов
s = paint(uri, weight=weight)
if not s:
return
print(s) # печать в командной строке преобразованного изображения в текст
# проверка на главную программу и запуск главной функции
if __name__ == '__main__':
main(sys.argv) # запускаем главную функцию с аргументами при запуске программы
# main(img_file) # запускаем главную функцию с картинкой из папки
================================================
FILE: texts/out.txt
================================================
.iljjjjjjjjjlr:
rYXXXXXXXXXXXXXXXVj.
ZX7:.;YXXXXXXXXXXXXXY.
1XXr ZXXXXXXXXXXXXXXC
LXXXY2FXXXXXXXXXXXXXXXY
r7777777777YXXXXXXXXXXY
ijC2222222222222222VXXXXXXXXXXY :::::..
lFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXY ;iiiiii;.
7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXC iiiiiiiii;
:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXY.:iiiiiiiiii.
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYl.:iiiiiiiiiii:
;XXXXXXXXXXXXXXX27jlllllllll1i:.:iiiiiiiiiiiii:
;XXXXXXXXXXXXYr.::;;;;;;;;;;;iiiiiiiiiiiiiiiii:
;XXXXXXXXXXXl.;iiiiiiiiiiiiiiiiiiiiiiiiiiiiiii:
.VXXXXXXXXXL ;iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii.
:YXXXXXXXX::iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii:
rZFXXXXX.:iiiiiiiiiiiiiiiiiiiiiiiiiiiiii:.
.:;;; :iiiiiiiiii;..................
:iiiiiiiiiiiiiiiiiiiii;
:iiiiiiiiiiiiiii:..;ii;
.iiiiiiiiiiiiii; ii:
.iiiiiiiiiiiiii;::;i:
.;iiiiiiiiiiiii;:.
.........
================================================
FILE: video_to_txt.py
================================================
"""
Python 3.10 программа преобразования видео в текст
видео можно загрузить как из файла так и из интернета
Название файла video_to_txt.py
Version: 0.1
Author: Andrej Marinchenko
Date: 2023-02-11
"""
import cv2
from PIL import Image
import numpy as np
import time
import sys
abc = '@MWNHB8$06XFVYZ27>1jli!;:,. '
l = 256 / len(abc)
def remove_transparency(im, bg_colour=(255, 255, 255)):
if im.mode in ('RGBA', 'LA') or (im.mode == 'P' and 'transparency' in im.info):
alpha = im.convert('RGBA').split()[-1]
bg = Image.new("RGBA", im.size, bg_colour + (255,))
bg.paste(im, mask=alpha)
return bg
else:
return im
def img2pixel(img, charwidth=100):
img = img.convert("L")
w, h = img.size
img = img.resize((charwidth, int(charwidth * (h / w) / 2.4)))
data = np.array(img)
return data
def pixel2char(data):
chars = '\n\n'
for row in data:
for pixel in row:
a = abc[int(pixel / l)]
chars += a
chars += '\n'
return chars + '\n'
def main(args):
start = time.time()
if len(args) != 3:
return
vcap = cv2.VideoCapture(args[1])
width = vcap.get(cv2.CAP_PROP_FRAME_WIDTH) # вещественное число
height = vcap.get(cv2.CAP_PROP_FRAME_HEIGHT) # вещественное число
fps = vcap.get(cv2.CAP_PROP_FPS)
print(width, height, fps)
currentframe = 0
while (True):
t1 = time.time()
ret, frame = vcap.read()
if ret:
pilimg = Image.fromarray(frame)
data = img2pixel(pilimg, charwidth=int(args[2]))
s = pixel2char(data=data)
print(s)
currentframe += 1
else:
break
time2sleep = (1 / fps) - (time.time() - t1)
if time2sleep > 0: time.sleep(time2sleep)
# Освободите пространство и окна
vcap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
main(sys.argv)
================================================
FILE: video_to_txt_rus.py
================================================
"""
Python 3.10 программа преобразования видео в текст
видео можно загрузить как из файла так и из интернета
Название файла video_to_txt_rus.py
Version: 0.1
Author: Andrej Marinchenko
Date: 2023-02-11
"""
import cv2
from PIL import Image
import numpy as np
import time
import sys
abc = '@MWNHB8$06XFVYZ27>1jli!;:,. '
l = 256 / len(abc)
def remove_transparency(im, bg_colour=(255, 255, 255)):
if im.mode in ('RGBA', 'LA') or (im.mode == 'P' and 'transparency' in im.info):
alpha = im.convert('RGBA').split()[-1]
bg = Image.new("RGBA", im.size, bg_colour + (255,))
bg.paste(im, mask=alpha)
return bg
else:
return im
def img2pixel(img, charwidth=100):
img = img.convert("L")
w, h = img.size
img = img.resize((charwidth, int(charwidth * (h / w) / 2.4)))
data = np.array(img)
return data
def pixel2char(data):
chars = '\n\n'
for row in data:
for pixel in row:
a = abc[int(pixel / l)]
chars += a
chars += '\n'
return chars + '\n'
def main(args):
start = time.time()
if len(args) != 3:
print("Использование: video_to_txt ширина символа видеопути")
return
# Получите информацию о ширине, высоте и частоте кадров видео
vcap = cv2.VideoCapture(args[1])
width = vcap.get(cv2.CAP_PROP_FRAME_WIDTH) # вещественное число
height = vcap.get(cv2.CAP_PROP_FRAME_HEIGHT) # вещественное число
fps = vcap.get(cv2.CAP_PROP_FPS)
print(width, height, fps)
# начать цикл по кадрам
currentframe = 0
while (True):
t1 = time.time()
ret, frame = vcap.read()
if ret:
pilimg = Image.fromarray(frame)
data = img2pixel(pilimg, charwidth=int(args[2]))
s = pixel2char(data=data)
print(s)
currentframe += 1
else:
break
# Время сна составляет одну долю секунды от кадров в секунду минус время, в течение которого этот кадр уже использовался.
time2sleep = (1 / fps) - (time.time() - t1)
if time2sleep > 0: time.sleep(time2sleep)
# Освободите пространство и окна
vcap.release()
cv2.destroyAllWindows()
print("Прошедшее время:", time.time() - start)
if __name__ == '__main__':
main(sys.argv)