Pergunta

A idéia desta função é a desvanecer-se do topo apenas metade da imagem (fazê-lo gradualmente mais escuro). Aqui está o que eu tenho, mas parece estar a fazer tudo da meia preta sólida.

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))
Foi útil?

Solução

Vamos olhar apenas uma linha aqui:

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

e uma parte chave aqui é

y*(2.0/h)

y mudanças, como você ir para baixo. Vamos tentar alguns valores simples para y e h. Vamos digamos h é de 100 e vamos examinar quando y é tanto 0 e 50 (h / 2). Para y = 0, obtemos 0. Para y = 50, temos 1. Se o seu intervalo de valores para as cores é de 256, com 0 sendo o mais escuro, então não é de admirar este é preto. O que você tem é um intervalo de valores de 0. para 1., mas eu estou supondo que você quer é tomar esse número e vezes pelo valor de cor de idade.

O que você quer é:

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

e coisas semelhantes para as outras cores.

Outras dicas

Para escurecer um pixel você multiplicam os níveis de vermelho, verde e azul por um fraco apropriada.

O que você está fazendo:

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

O que você está sendo dito para fazer:

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

Saiba o que a escala é para os setBlue / vermelho / métodos verdes. Presumo 0 corresponde ao preto, mas o que é o mais brilhante? Você parece estar assumindo que é 1, mas pode realmente ser 255 ou algo assim. Mesmo que seja 1, parece que este código não está tomando o valor antigo do pixel em conta, é só defini-lo como uma cor exata, com base em sua posição vertical. Talvez seja isso que você quer, mas eu duvido. Você provavelmente vai querer multiplicar o valor atual do pixel por algo em vez.

Apenas para compartilhar uma versão melhorada e adicionar alguns recursos visuais (porque visuais são bons) ...

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


Saída ( Pintura pela Corneliu Baba - O Rei Louco ):


............ enter descrição da imagem aqui ..... ................. enter descrição da imagem aqui ... .........


Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top