Pregunta

La idea de esta función es la de atenuar la mitad superior de la imagen única (que sea gradualmente más oscuro). Aquí es lo que tengo, pero parece estar haciendo todo el negro sólido mitad superior.

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

Solución

Veamos una sola línea aquí:

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

y parte clave aquí es

y*(2.0/h)

cambios de y, a medida que avanza hacia abajo. Vamos a tratar algunos valores simples para yy h. Digamos que h es 100 y examinaremos cuando y es tanto 0 y 50 (h / 2). Para y = 0, obtenemos y = 0. Por 50, obtenemos 1. Si el rango de valores para los colores es de 256, siendo 0 el más oscuro, entonces no es de extrañar que esto es negro. Lo que tenemos es un rango de valores de 0 a 1., pero estoy adivinando lo que desea es tomar ese número y veces por el valor de color de edad.

Lo que queremos es:

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

y cosas similares para los otros colores.

Otros consejos

  

Para oscurecer un pixel multiplican los niveles de rojo, verde y azul por una fracción apropiada.

Lo que está haciendo:

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

Lo que están diciendo que hacer:

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

Para saber cuál es la escala para la setBlue / métodos Verde Rojo /. Asumo 0 corresponde a negro, pero ¿cuál es el más brillante? Usted parece estar asumiendo que es 1, pero en realidad puede ser 255 o algo así. Incluso si es 1, parece que este código no se está viejo valor del píxel en cuenta, es sólo ajustarlo a un color exacto, basado en su posición vertical. Tal vez eso es lo que quiere, pero lo dudo. Es posible que desee para multiplicar el valor actual del pixel por algo en su lugar.

Sólo para compartir una versión mejorada y añadir algunos efectos visuales (porque son buenos efectos visuales) ...

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


Salida ( Pintura por Corneliu Baba - El Rey Loco ):


............ introducir descripción de la imagen aquí ..... ................. introducir descripción de la imagen aquí ... .........


Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top