Вопрос

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

def fadeDownFromBlack(pic1):

w=getWidth(pic1)
h=getHeight(pic1)

for y in range(0,h/2):
     for x in range(0,w):
        px=getPixel(pic1,x,y) 
        setBlue(px,y*(2.0/h)) 
        setRed(px,y*(2.0/h)) 
        setGreen(px,y*(2.0/h))
Это было полезно?

Решение

Давайте рассмотрим здесь только одну строку:

setBlue(px,y*(2.0/h))

и ключевой частью здесь является

y*(2.0/h)

все меняется по мере того, как вы спускаетесь вниз.Давайте попробуем несколько простых значений для y и h.Допустим, h равно 100, и мы рассмотрим, когда y равно как 0, так и 50 (h / 2).При y = 0 мы получаем 0.При y = 50 мы получаем 1.Если ваш диапазон значений для цветов равен 256, где 0 - самый темный, то неудивительно, что это черный.То, что у вас есть, - это диапазон значений от 0.к 1., но я предполагаю, что вы хотите взять это число и умножить его на старое значение цвета.

То, чего ты хочешь, это:

setBlue(px,y*(2.0/h)*getBlue(px))

и подобные вещи для других цветов.

Другие советы

Чтобы затемнить пиксель, вы умножать красный, зеленый и синий уровни в соответствующей пропорции.

Что ты делаешь:

setBlue(px,y*(2.0/h))

То, что вам говорят делать:

setBlue(px,y*(2.0/h) * getBlue(px))

Узнайте, какова шкала для методов setBlue / Red /Green.Я предполагаю, что 0 соответствует черному, но какой самый яркий?Кажется, вы предполагаете, что это 1, но на самом деле это может быть 255 или что-то в этом роде.Даже если оно равно 1, похоже, что этот код не учитывает старое значение пикселя, он просто присваивает ему точный цвет, основанный на его вертикальном положении.Может быть, это то, чего ты хочешь, но я сомневаюсь в этом.Вероятно, вместо этого вы захотите умножить текущее значение пикселя на что-то другое.

Просто чтобы поделиться улучшенной версией и добавить некоторые визуальные эффекты (потому что визуальные эффекты хороши)...

# 'divisor' : How much we expand the gradient (less is more)
# 'switch' : If True, start gradient from bottom to top
def fadeDownFromBlack(pic, divisor, switch=False):  

   w = getWidth(pic)
   h = getHeight(pic)


   startY = 0
   endY = min(h-1, int(h/float(divisor)))
   inc = 1

   if (switch):
     startY = h-1
     endY = max(0, h-1 - int(h/float(divisor)))
     inc = -1

   color_ratio = float(divisor)/h

   for y in range(startY, endY, inc): 
       for x in range(0,w):
           px = getPixel(pic, x, y )
           setRed(px, abs(startY - y)*(color_ratio)*getRed(px))
           setGreen(px, abs(startY - y)*(color_ratio)*getGreen(px))
           setBlue(px, abs(startY - y)*(color_ratio)*getBlue(px))


file = pickAFile()
picture = makePicture(file)
# The following commented line answers the question
#fadeDownFromBlack(picture, 2)
fadeDownFromBlack(picture, 0.7, True)

writePictureTo(picture, "/home/mad-king.png")

show(picture)


Результат (Картина автора Корнелиу Баба - Безумный Король):


............enter image description here......................enter image description here............


Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top