2010-02-10 4 views
6

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

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

Я предполагаю, что вы используете PIL? (Просто проверяю.) – MatrixFrog

+0

Я так не верю, нет. Если это не произойдет с Jython 4.3. – roger34

+0

Из бумаги: Чтобы затемнить пиксель, вы умножаете красный, зеленый и синий уровни на соответствующую фракцию. В частности, если y находится в верхней половине изображения, все пиксели в строке y имеют уровни RGB, умноженные на y * (2.0/h), где h - высота изображения. Пиксели в нижней половине изображения не изменяются. Я предполагаю, что мне не нужно использовать setBlue и т. Д., А? Использую ли я возвращение? – roger34

ответ

3

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

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

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

+0

Большое вам спасибо! Ты великолепен. – roger34

+0

Ум, отмечая это как принятый ответ, тогда? Нажмите на галочку рядом с вопросом. – badp

+0

Ха-ха, спасибо, мне было интересно, есть ли у меня способ сделать это, или если это было определено upvotes. – roger34

2

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

+1

Шкала действительно 0-255. – badp

+0

Из бумаги: Чтобы затемнить пиксель, вы умножаете красный, зеленый и синий уровни на соответствующую фракцию. В частности, если y находится в верхней половине изображения, все пиксели в строке y имеют уровни RGB, умноженные на y * (2.0/h), где h - высота изображения. Пиксели в нижней половине изображения не изменяются. Я предполагаю, что мне не нужно использовать setBlue и т. Д., А? Использую ли я возвращение? – roger34

4

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

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

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

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

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

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

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


Output (Картина Корнелиу Баба - The Mad King):


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


Смежные вопросы