Pixelate South Africa 02

2026-01-20

"""2026-01-20
Pixelate South Africa 02
Exercício de pixelar a bandeira da África do Sul
ericof.com
png
Sketch,py5,CreativeCoding
"""

from sketches.utils.draw import canvas
from sketches.utils.helpers import sketches as helpers
from sketches.utils.helpers.images import image_as_array
from sketches.utils.helpers.recursos import caminho_arquivo

import numpy as np
import py5


sketch = helpers.info_for_sketch(__file__, __doc__)


def pixelate(img_array: np.ndarray, bloco: int = 7):
    py5.no_stroke()
    total_x = len(img_array[0])
    total_y = len(img_array)
    slots_x = range(0, total_x, bloco)
    slots_y = range(0, total_y, bloco)
    for x in slots_x:
        for y in slots_y:
            block = img_array[y : y + bloco, x : x + bloco]
            avg_color = np.median(block, axis=(0, 1))
            py5.fill(avg_color[0], avg_color[1], avg_color[2], 100)
            py5.circle(x, y, bloco * 0.75)


def setup():
    py5.size(*helpers.DIMENSOES.external, py5.P3D)
    cor_fundo = py5.color(0)
    py5.background(cor_fundo)
    # py5.color_mode(py5.HSB, 360, 100, 100)x
    arquivo = caminho_arquivo("flag-za.png")
    img_array = image_as_array(arquivo)
    altura = len(img_array)
    largura = len(img_array[0])
    x = (helpers.DIMENSOES.external[0] - largura) / 2
    y = (helpers.DIMENSOES.external[1] - altura) / 2
    with py5.push():
        py5.translate(x, y, -20)
        pixelate(img_array)

    # Credits and go
    canvas.sketch_frame(
        sketch, cor_fundo, "large_transparent_white", "transparent_white"
    )


def key_pressed():
    key = py5.key
    if key == " ":
        save_and_close()


def save_and_close():
    py5.no_loop()
    canvas.save_sketch_image(sketch)
    py5.exit_sketch()


if __name__ == "__main__":
    py5.run_sketch()