Question

The idea of this function is to fade the top half only of the picture (make it gradually darker). Here is what I have but it seems to be making all of the top half solid black.

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))
Was it helpful?

Solution

Let's look at just one line here:

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

and key part here is

y*(2.0/h)

y changes, as you go down. Let's try some simple values for y and h. Let's say h is 100 and we will examine when y is both 0 and 50 (h/2). For y = 0, we get 0. For y = 50, we get 1. If your range of values for the colors is 256 with 0 being the darkest, then no wonder this is black. What you have is a range of values from 0. to 1., but I'm guessing what you want is to take that number and times it by the old color value.

What you want is:

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

and similar things for the other colors.

OTHER TIPS

To darken a pixel you multiply the red, green and blue levels by an appropriate fraction.

What you are doing:

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

What you are being told to do:

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

Find out what the scale is for the setBlue/Red/Green methods. I assume 0 corresponds to black, but what's the brightest? You seem to be assuming it's 1, but it might actually be 255 or something. Even if it is 1, it looks like this code isn't taking the pixel's old value into account, it's just setting it to an exact color, based on its vertical position. Maybe that's what you want, but I doubt it. You probably want to multiply the pixel's current value by something instead.

Just to share an enhanced version and add some visuals (because visuals are good)...

# '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 (Painting by Corneliu Baba - The Mad King):


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


Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top