2010-02-10 16 views
6

Die Idee dieser Funktion besteht darin, nur die obere Hälfte des Bildes zu verblassen (langsam dunkler machen). Hier ist, was ich habe, aber es scheint die ganze obere Hälfte schwarz zu machen.Ein Bild schrittweise ausblenden

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

Ich nehme an, Sie verwenden PIL? (Einfach überprüfen.) – MatrixFrog

+0

Ich glaube nicht, nein. Es sei denn, es kommt mit Jython 4.3. – roger34

+0

Aus dem Papier: Um ein Pixel zu verdunkeln multiplizieren Sie die roten, grünen und blauen Ebenen mit einem entsprechenden Bruchteil. Insbesondere, wenn y in der oberen Hälfte des Bildes ist, haben alle Pixel in der Reihe y ihre RGB-Pegel multipliziert mit y * (2,0/h), wobei h die Höhe des Bildes ist. Die Pixel in der unteren Hälfte des Bildes werden nicht verändert. Ich gehe davon aus, dass ich SetBlue usw. dann nicht verwenden muss? Würde ich zurückgeben? – roger34

Antwort

3

die auf nur eine Zeile hier Lassen:

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

und Schlüssel hier Teil

y*(2.0/h) 

y ändert, wie Sie unten gehen. Lassen Sie uns einige einfache Werte für y und h ausprobieren. Nehmen wir an, h ist 100 und wir werden untersuchen, wenn y sowohl 0 als auch 50 (h/2) ist. Für y = 0 erhalten wir 0. Für y = 50 erhalten wir 1. Wenn Ihr Wertebereich für die Farben 256 ist und 0 die dunkelste ist, dann ist das kein Wunder, dass es schwarz ist. Was Sie haben, ist ein Bereich von Werten von 0. bis 1., aber ich rate, was Sie wollen, ist diese Zahl zu nehmen und sie um den alten Farbwert zu multiplizieren.

Was Sie wollen, ist:

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

und ähnliche Dinge für die anderen Farben.

+0

Vielen Dank! Du bist erstaunlich. – roger34

+0

Denke daran, dies als die akzeptierte Antwort zu markieren? Klicken Sie auf das Häkchen neben der Frage. – badp

+0

Haha ok danke Ich habe mich gefragt, ob es einen Weg für mich gibt oder ob es von Upvotes bestimmt wurde. – roger34

2

Finden Sie heraus, was die Skala für die setBlue/Red/Green-Methoden ist. Ich nehme an, dass 0 Schwarz entspricht, aber was ist das Hellste? Sie scheinen davon auszugehen, dass es 1 ist, aber es könnte 255 oder so sein. Selbst wenn es 1 ist, sieht es so aus, als ob dieser Code nicht den alten Wert des Pixels berücksichtigt, sondern ihn nur auf eine exakte Farbe basierend auf seiner vertikalen Position setzt. Vielleicht ist es das, was du willst, aber ich bezweifle es. Wahrscheinlich möchten Sie den aktuellen Wert des Pixels stattdessen mit etwas multiplizieren.

+1

Die Skala ist in der Tat 0-255. – badp

+0

Aus dem Papier: Um ein Pixel zu verdunkeln multiplizieren Sie die roten, grünen und blauen Ebenen mit einem entsprechenden Bruchteil. Insbesondere, wenn y in der oberen Hälfte des Bildes ist, haben alle Pixel in der Reihe y ihre RGB-Pegel multipliziert mit y * (2,0/h), wobei h die Höhe des Bildes ist. Die Pixel in der unteren Hälfte des Bildes werden nicht verändert. Ich nehme an, dass ich setBlue usw. dann nicht verwenden muss? Würde ich zurückgeben? – roger34

4

Um ein Pixel zu verdunkeln multiplizieren die roten, grünen und blauen Ebenen durch einen entsprechenden Bruchteil.

Was Sie tun:

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

Was Sie werden dazu aufgefordert werden:

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

einfach eine erweiterte Version zu teilen und einige visuelle Elemente (weil Visuals gut sind). ..

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


Ausgang (Malerei von Corneliu Baba - der wütende König):


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