Introdução à programação
com Python em um contexto visual


Experimentos com retículas e imagens

Podemos consultar as cores dos pixels de uma imagem na memória e produzir uma nova retícula usando uma amostra das cores na posição de uma grade de elementos.

Criando uma grade de elementos

num_colunas = num_filas = 10

def setup():
    size(800, 800)
    background(255) # fundo branco
    no_stroke() # sem contorno nos elementos
    fill(0)     # preenchimento preto
    esp = width / num_colunas  # calcula o espaçamento
    for fila in range(num_filas):
        y = esp / 2 + esp * fila
        for coluna in range(num_colunas):
            x = esp / 2 + esp * coluna
            diametro = esp * 0.75
            circle(x, y, diametro)  

image

Agora vamos carregar esta imagem na memória:

image

def setup():
    global img
    size(800, 800)
    img = load_image("https://upload.wikimedia.org/wikipedia/commons/d/dd/Adalovelace.jpg")
    
def draw():
    no_stroke()
    num_colunas = num_filas = 10
    esp = width / num_colunas
    background(0)  # fundo preto
    for m in range(num_filas):
        y = m * esp + esp / 2
        for n in range(num_colunas):  # 0, 1, 2, 3, 4, 5
            x = n * esp + esp / 2
            xi = int(remap(x, 0, width, 0, img.width))
            yi = int(remap(y, 0, height, 0, img.height))
            cor = img.get_pixels(xi, yi)
            fill(cor)
            circle(x, y, esp)

image

Experimente aumentar um pocuo o número de filas e colunas. No exemplo abaixo vamos ignorar as cores dos pixels e mudar o diâmetro usando o valor da luminosidade das cores.

num_colunas = num_filas = 80

def setup():
    size(800, 800)
    global img
    img = load_image("https://upload.wikimedia.org/wikipedia/commons/d/dd/Adalovelace.jpg")
    
def draw():    
    background(0) # fundo preto
    if img:
        #image(img, 0, 0, 800, 800)
        no_stroke() # sem contorno nos elementos
        esp = width / num_colunas  # calcula o espaçamento
        for fila in range(num_filas):
            y = esp / 2 + esp * fila
            for coluna in range(num_colunas):
                x = esp / 2 + esp * coluna
                xi = remap(x, 0, width, 0, img.width)
                yi = remap(y, 0, height, 0, img.height)
                cor = img.get_pixels(int(xi), int(yi))
                #fill(cor)
                fill(255)
                diametro = brightness(cor) / 255 * esp
                circle(x, y, diametro)    

ada

Exemplo retícula pontos pretos

num_colunas = num_filas = 100

def setup():
    global img
    size(800, 800)
    img = load_image("https://upload.wikimedia.org/wikipedia/commons/d/dd/Adalovelace.jpg")
    # img = load_image("Adalovelace.jpg")
    
def draw():
    background(255)  # fundo branco
    esp = width / num_colunas
    if img:
        for fila in range(num_filas):
            y = fila * esp + esp / 2
            for coluna in range(num_colunas):  # 0, 1, 2, 3, 4, 5
                x = coluna * esp + esp / 2
                # remap(v, inicial_origem, final_origem, inicial_algo, final_alvo)
                xi = int(remap(x, 0, width, 0, img.width))
                yi = int(remap(y, 0, height, 0, img.height))
                cor = img.get_pixels(xi, yi)
                b = brightness(cor)
                fill(0)
                #fill(cor)
                no_stroke()
                d = remap(b, 0, 255, esp + 5, 0) 
                circle(x, y, d)

image

Cores saturadas

No exemplo abaixo vamos reconstruir as cores usando o moo HSB, usando a informação do matiz, mas as tornado super saturadas. Infelizmente no editor online este e os próximos exemplos produzem cores distorcidas.

def setup():
    global img
    size(800, 800)
    img = load_image("Adalovelace.jpg")    
    
def draw():
    background(0)  # fundo
    num_colunas = num_filas = 100
    esp = width / num_colunas
    if img:
        for m in range(num_filas):
            y = m * esp + esp / 2
            for n in range(num_colunas):  # 0, 1, 2, 3, 4, 5
                x = n * esp + esp / 2
                # remap(v, inicial_origem, final_origem, inicaial_algo, final_alvo)
                xi = int(remap(x, 0, width, 0, img.width))
                yi = int(remap(y, 0, height, 0, img.height))
                cor = img.get_pixels(xi, yi)
                b = brightness(cor)
                h = hue(cor)
                color_mode(HSB) # Matiz, Sat, Bri
                nova_cor = color(h, 255, 255)
                fill(nova_cor)
                d = remap(b, 0, 255, 0, esp) 
                no_stroke()
                circle(x, y, d)

image

Cores saturadas escuras com quadradinhos

num_colunas = num_filas = 100

def setup():
    global img
    size(800, 800)
    img = load_image("https://upload.wikimedia.org/wikipedia/commons/d/dd/Adalovelace.jpg")
    # img = load_image("Adalovelace.jpg") # se tiver uma cópia local   
    
    
def draw():
    background(255)  # fundo branco
    esp = width / num_colunas
    if img:
        for m in range(num_filas):
            y = m * esp + esp / 2
            for n in range(num_colunas):  # 0, 1, 2, 3, 4, 5
                x = n * esp + esp / 2
                # remap(v, inicial_origem, final_origem, inicaial_algo, final_alvo)
                xi = int(remap(x, 0, width, 0, img.width))
                yi = int(remap(y, 0, height, 0, img.height))
                cor = img.get_pixels(xi, yi)
                b = brightness(cor)
                h = hue(cor)
                color_mode(HSB) # Matiz, Sat, Bri
                nova_cor = color(h, 255, 128)
                fill(nova_cor)
                d = 0 + remap(b, 0, 255, esp, 0) 
                no_stroke()
                rect_mode(CENTER)
                #circle(X, Y, D)
                square(x, y, d)

out