2010-02-10 73 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 2010-02-10 23:16:23

+0

我不这么认为,不。除非它带有Jython 4.3。 – roger34 2010-02-11 00:08:07

+0

从纸张:要通过适当的分数变暗你乘的红色,绿色和蓝色的水平像素。具体地,如果y是在画面的上半部分,在第y行的所有像素具有其RGB级别乘以Y *(2.0 /小时),其中h是图像的高度。图片下半部分的像素不会改变。 我假设我不需要使用setBlue等呢?我会使用回报? – roger34 2010-02-11 00:13:53

回答

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 2010-02-11 00:37:10

+0

记住这是接受的答案,然后呢?点击问题侧面的复选标记。 – badp 2010-02-11 00:56:55

+0

哈哈好的,谢谢我想知道是否有办法让我这样做,或者如果它是upvotes确定的。 – roger34 2010-02-11 01:06:33

2

找出setBlue/Red/Green方法的规模。我假设0对应于黑色,但最亮的是什么?你似乎认为它是1,但实际上它可能是255或其他东西。即使它是1,它看起来像这个代码没有考虑像素的旧值,只是根据其垂直位置将其设置为精确的颜色。也许这就是你想要的,但我怀疑它。您可能想要将像素的当前值乘以某个值。

+1

规模确实是0-255。 – badp 2010-02-10 23:23:13

+0

来自纸张:要使像素变暗,请将红色,绿色和蓝色等级乘以适当的分数。具体地,如果y是在画面的上半部分,在第y行的所有像素具有其RGB级别乘以Y *(2.0 /小时),其中h是图像的高度。图片下半部分的像素不会改变。我假设我不需要使用setBlue等呢?我会使用回报? – roger34 2010-02-11 00:14:08

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) 


输出(绘画由科尔内留巴巴 - 疯狂的国王):


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