В цикле for не работает if, как при построчном написании множества if

Рейтинг: 0Ответов: 0Опубликовано: 19.01.2023

Я делаю программу, которая делает из картинки чёрно-белую версию и выводит её в консоль. Возникла проблема в автоматизации проверок на определение нужного цвета. Мне нужно, чтобы градиент из символов (@%#*+=-:. ) соответствовал коду цвета пикселя (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()

Вполне возможно, что я был невнимательным и что-то не правильно написал в изменении чисел, хоть я и тщательно всё проверял.

Ответы

Ответов пока нет.