Fading a picture gradually

荒凉一梦 提交于 2019-12-07 02:36:55

问题


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

回答1:


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.




回答2:


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



回答3:


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.




回答4:


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


............

......................

............


来源:https://stackoverflow.com/questions/2240566/fading-a-picture-gradually

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!