В цикле for не работает if, как при построчном написании множества if
Я делаю программу, которая делает из картинки чёрно-белую версию и выводит её в консоль. Возникла проблема в автоматизации проверок на определение нужного цвета. Мне нужно, чтобы градиент из символов (@%#*+=-:. ) соответствовал коду цвета пикселя (0:255). Это у меня удалось сделать, но мне нужно, чтобы я мог менять количество символов градиента, не добавляя большого количества if'ов.
Рабочий код:
import keyboard as kb
from PIL import Image
import os
# X, Y экрана
scX = 211
scY = 50
# изменение размера консоли
os.system("mode con cols=211lines=50")
kb.press_and_release('F11')
# запрос пути к картинке
passToImage = str(input('Pass to image: '))
sourceImage = Image.open(passToImage)
# картинка разрешения консоли
image = sourceImage.resize((scX, scY))
# контраст (и Ч/Б)
r, g, b = image.split()
image = g
# вытаскиваю по пикселю и вставляю в массив его яркость
massive = []
for j in range(scY):
for i in range(scX):
pix = image.crop((i-1, j-1, i, j))
massive += pix.getcolors()
# разделяю числа в массиве на 10 чисел (длина градиента)
gradient = ['@', '%', '#', '*', '+', '=', '-', ':', '.', ' ']
for i in range(len(massive)):
# num - это переменная, в которую записано чистое число яркости пикселя (изначально число было "(1, 255)", а стало "255")
num = int(str(massive[i])[str(massive[i]).find(' '): str(massive[i]).find(')')])
if num <= 255 / (len(gradient) - 0):
massive[i] = gradient[0]
if 255 / (len(gradient) - 1) >= num > 255 / (len(gradient) - 0):
massive[i] = gradient[1]
if 255 / (len(gradient) - 2) >= num > 255 / (len(gradient) - 1):
massive[i] = gradient[2]
if 255 / (len(gradient) - 3) >= num > 255 / (len(gradient) - 2):
massive[i] = gradient[3]
if 255 / (len(gradient) - 4) >= num > 255 / (len(gradient) - 3):
massive[i] = gradient[4]
if 255 / (len(gradient) - 5) >= num > 255 / (len(gradient) - 4):
massive[i] = gradient[5]
if 255 / (len(gradient) - 6) >= num > 255 / (len(gradient) - 5):
massive[i] = gradient[6]
if 255 / (len(gradient) - 7) >= num > 255 / (len(gradient) - 6):
massive[i] = gradient[7]
if 255 / (len(gradient) - 8) >= num > 255 / (len(gradient) - 7):
massive[i] = gradient[8]
if 255 / (len(gradient) - 9) >= num > 255 / (len(gradient) - 8):
massive[i] = gradient[9]
# печать в консоли
for j in range(scY):
x = ''
for i in range(scX-1):
x += str(massive[i+j*scX])
print(x)
input()
То, что я пытался написать:
for i in range(len(massive)):
num = int(str(massive[i])[str(massive[i]).find(' '): str(massive[i]).find(')')])
# первая проверка не нуждается в ограничении с двух сторон (то есть проверка смотрит, число меньше, чем пороговое значение первого числа градиента, или нет)
if num <= 255 / (len(gradient)):
massive[i] = gradient[0]
# ТУТ ПРОБЛЕМА: делаю всё те же проверки, что и в первом варианте с такими же зависимостями в изменении чисел.
# градиент-1 потому что одна проверка уже была совершена выше
for j in range(len(gradient)-1):
if 255 / (len(gradient) - j+1) >= num > 255 / (len(gradient) - j):
massive[i] = gradient[j+1]
# печать в консоли
for j in range(scY):
x = ''
for i in range(scX-1):
x += str(massive[i+j*scX])
print(x)
input()
Вполне возможно, что я был невнимательным и что-то не правильно написал в изменении чисел, хоть я и тщательно всё проверял.
Источник: Stack Overflow на русском