Постепенное исчезновение изображения

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

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

person roger34    schedule 10.02.2010    source источник
comment
Я предполагаю, что вы используете PIL? (Просто проверяю.)   -  person MatrixFrog    schedule 11.02.2010
comment
Я так не думаю, нет. Если только он не поставляется с Jython 4.3.   -  person roger34    schedule 11.02.2010
comment
Из статьи: Чтобы затемнить пиксель, вы умножаете уровни красного, зеленого и синего на соответствующую дробь. В частности, если y находится в верхней половине изображения, все пиксели в строке y имеют уровни RGB, умноженные на y*(2,0/h), где h — высота изображения. Пиксели в нижней половине изображения не изменяются. Я предполагаю, что тогда мне не нужно использовать setBlue и т. Д.? Буду ли я использовать возврат?   -  person roger34    schedule 11.02.2010
comment
Хорошо, я полагаю, что мое пятое предположение об используемых библиотеках (и, следовательно, тегах, применяемых к вопросу) верно? coweb.cc.gatech.edu/mediaComp-plan/94   -  person badp    schedule 11.02.2010


Ответы (4)


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

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

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

y*(2.0/h)

y меняется, когда вы идете вниз. Давайте попробуем некоторые простые значения для 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))

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

person Justin Peel    schedule 11.02.2010
comment
Большое спасибо! Ты великолепен. - person roger34; 11.02.2010
comment
Тогда не могли бы вы отметить это как принятый ответ? Нажмите на галочку рядом с вопросом. - person badp; 11.02.2010
comment
Ха-ха, хорошо, спасибо, мне было интересно, есть ли у меня способ сделать это или это было определено голосованием. - person roger34; 11.02.2010

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

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

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

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

setBlue(px,y*(2.0/h) * getBlue(px))
person badp    schedule 11.02.2010

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

person MatrixFrog    schedule 10.02.2010
comment
Из статьи: Чтобы затемнить пиксель, вы умножаете уровни красного, зеленого и синего на соответствующую дробь. В частности, если y находится в верхней половине изображения, все пиксели в строке y имеют уровни RGB, умноженные на y*(2,0/h), где h — высота изображения. Пиксели в нижней половине изображения не изменяются. Я предполагаю, что тогда мне не нужно использовать setBlue и т. Д.? Буду ли я использовать возврат? - person roger34; 11.02.2010

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

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


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


............введите здесь описание изображения........ ..............введите здесь описание изображения...... ......


person Gauthier Boaglio    schedule 29.06.2013