Постепенно исчезая картинка - PullRequest
6 голосов
/ 11 февраля 2010

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

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))

Ответы [ 4 ]

4 голосов
/ 11 февраля 2010

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

Что вы делаете:

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

Что вам говорят делать:

setBlue(px,y*(2.0/h) * getBlue(px))
3 голосов
/ 11 февраля 2010

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

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

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

y*(2.0/h)

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

То, что вы хотите:

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

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

2 голосов
/ 29 июня 2013

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

# '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 ....... .....


2 голосов
/ 11 февраля 2010

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

...