2010-02-10 12 views
6

Ideą tej funkcji jest zniknięcie tylko górnej części obrazu (stopniowo zmniejszane). Oto, co mam, ale wydaje się, że cała górna połowa jest czarna.Zanikanie obrazu stopniowo

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

Zakładam, że korzystasz z PIL? (Tylko sprawdzam.) – MatrixFrog

+0

Nie wierzę, nie. O ile nie jest wyposażony w Jython 4.3. – roger34

+0

Z papieru: Aby przyciemnić piksel, pomnóż poziomy czerwony, zielony i niebieski przez odpowiednią frakcję. W szczególności, jeśli y znajduje się w górnej połowie obrazu, wszystkie piksele w wierszu y mają ich poziomy RGB pomnożone przez y * (2,0/h), gdzie h jest wysokością obrazu. Piksele w dolnej połowie obrazu nie są zmieniane. Zakładam, że nie potrzebuję używać SetBlue itp.? Czy mogę użyć zwrotu? – roger34

Odpowiedz

3

Spójrzmy tylko jedną linię tutaj:

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

i część Kluczem jest tu

y*(2.0/h) 

y zmiany, jak zejść. Spróbujmy prostych wartości dla y i h. Powiedzmy, że h to 100, a my zbadamy, kiedy y jest równe 0 i 50 (h/2). Dla y = 0 otrzymujemy 0. Dla y = 50, otrzymujemy 1. Jeśli twój zakres wartości dla kolorów wynosi 256, gdzie 0 jest najciemniejszy, to nic dziwnego, że jest czarny. To, co masz, to zakres wartości od 0 do 1, ale domyślam się, że chcesz wziąć tę liczbę i pomnożyć ją przez starą wartość koloru.

Co chcesz to:

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

i podobne rzeczy dla innych kolorów.

+0

Dziękuję bardzo! Jesteś niesamowity. – roger34

+0

Czy uważasz to za akceptowaną odpowiedź? Kliknij znacznik wyboru z boku pytania. – badp

+0

Haha ok, dzięki, zastanawiałem się, czy był dla mnie sposób, aby to zrobić, czy też został ustalony przez upvotes. – roger34

2

Dowiedz się, jaka jest skala dla metod setBlue/Red/Green. Zakładam, że 0 odpowiada czerni, ale jaka jest najjaśniejsza? Wygląda na to, że masz 1, ale może to być 255 lub coś podobnego. Nawet jeśli wynosi 1, wygląda na to, że ten kod nie uwzględnia starej wartości piksela, po prostu ustawia ją na dokładny kolor, w oparciu o jej położenie w pionie. Może tego właśnie chcesz, ale wątpię w to. Prawdopodobnie chcesz pomnożyć bieżącą wartość piksela przez coś innego.

+1

Skala jest rzeczywiście 0-255. – badp

+0

Na papierze: Aby przyciemnić piksel, pomnóż poziomy czerwony, zielony i niebieski przez odpowiednią frakcję. W szczególności, jeśli y znajduje się w górnej połowie obrazu, wszystkie piksele w wierszu y mają ich poziomy RGB pomnożone przez y * (2,0/h), gdzie h jest wysokością obrazu. Piksele w dolnej połowie obrazu nie są zmieniane. Zakładam, że nie muszę używać setBlue etc? Czy mogę użyć zwrotu? – roger34

4

Aby przyciemnić piksel, pomnóż pomnóż poziom przez czerwony, zielony i niebieski poziom przez odpowiednią część.

Co robisz:

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

Co wmawia zrobić:

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

Wystarczy udostępnić wersję rozszerzoną i dodać jakieś efekty wizualne (ponieważ wizualne są dobre). ..

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


wyjściowa (Malarstwo Corneliu Baby - Mad króla):


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