2010-02-10 71 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 ............