Mudanças entre as edições de "Computação Gráfica: Transformações em Imagens Matriciais"

De Aulas
Linha 10: Linha 10:
  
 
= Alteração de Dimensões =
 
= Alteração de Dimensões =
 +
 +
<syntaxhighlight lang=python line>
 +
import sys
 +
import pygame
 +
 +
 +
# Retorna x e y equivalente da imagem original na destino
 +
def get_dest_xy(x_orig, y_orig, proportion):
 +
    x = int(proportion * x_orig / 100)  # calcula a regra de tres de x
 +
    y = int(proportion * y_orig / 100)  # calcula a regra de tres de y
 +
    return x, y
 +
 +
 +
# Retorna x e y equivalente da imagem destino na original
 +
def get_orig_xy(x_dest, y_dest, proportion):
 +
    p = 100 / (proportion / 100)    # pega o percentual invertido
 +
    x = int(p * x_dest / 100)      # calcula a regra de tres de x
 +
    y = int(p * y_dest / 100)      # calcula a regra de tres de y
 +
    return x, y
 +
 +
 +
# Redimensiona a imagem
 +
def resize(image, surface, proportion):
 +
    # Para cada coluna da imagem de destino
 +
    for y in range(surface.get_height()):
 +
        # Para cada linha da imagem de destino
 +
        for x in range(surface.get_width()):
 +
            # pega o x e y relativo da imagem original
 +
            x2, y2 = get_orig_xy(x, y, proportion)
 +
            # e pinta na imagem de destino
 +
            surface.set_at((x, y), image.get_at((x2, y2)))
 +
 +
 +
# PROGRAMA PRINCIPAL
 +
pygame.init()
 +
 +
file_in = sys.argv[1]
 +
file_out = sys.argv[2]
 +
proportion = int(sys.argv[3])
 +
 +
image = pygame.image.load(file_in)
 +
w = image.get_width()
 +
h = image.get_height()
 +
sw, sh = get_dest_xy(w, h, proportion)
 +
 +
# cria a surface com a proporção a ser alterada
 +
surface = pygame.display.set_mode((sw, sh))
 +
 +
# chama a função pra redimensionar
 +
resize(image, surface, proportion)
 +
 +
# salva a surface como nova imagem
 +
pygame.image.save(surface, file_out)
 +
 +
pygame.display.set_caption(file_in)
 +
 +
finish = False
 +
while not finish:
 +
    for event in pygame.event.get():
 +
        if event.type == pygame.QUIT:
 +
            finish = True
 +
        elif event.type == pygame.KEYDOWN:
 +
            if event.key == pygame.K_ESCAPE:
 +
                finish = True
 +
    pygame.display.update()
 +
pygame.quit()
 +
quit()
 +
</syntaxhighlight>

Edição das 14h58min de 15 de março de 2022

Afluentes: Computação Gráfica

Transformações Geométricas

As transformações geométricas são operações de processamento de imagem para alterar a posição inicial dos seus píxels. Dentre algumas operações, temos ampliação, diminuição, espelhamento, rotação, distorção, etc.. Veremos alguns deles aqui.

Para nossos testes, iremos utilizar a imagem abaixo:

Saulopz20173.jpg

Alteração de Dimensões

 1import sys
 2import pygame
 3
 4
 5# Retorna x e y equivalente da imagem original na destino
 6def get_dest_xy(x_orig, y_orig, proportion):
 7    x = int(proportion * x_orig / 100)  # calcula a regra de tres de x
 8    y = int(proportion * y_orig / 100)  # calcula a regra de tres de y
 9    return x, y
10
11
12# Retorna x e y equivalente da imagem destino na original
13def get_orig_xy(x_dest, y_dest, proportion):
14    p = 100 / (proportion / 100)    # pega o percentual invertido
15    x = int(p * x_dest / 100)       # calcula a regra de tres de x
16    y = int(p * y_dest / 100)       # calcula a regra de tres de y
17    return x, y
18
19
20# Redimensiona a imagem
21def resize(image, surface, proportion):
22    # Para cada coluna da imagem de destino
23    for y in range(surface.get_height()):
24        # Para cada linha da imagem de destino
25        for x in range(surface.get_width()):
26            # pega o x e y relativo da imagem original
27            x2, y2 = get_orig_xy(x, y, proportion)
28            # e pinta na imagem de destino
29            surface.set_at((x, y), image.get_at((x2, y2)))
30
31
32# PROGRAMA PRINCIPAL
33pygame.init()
34
35file_in = sys.argv[1]
36file_out = sys.argv[2]
37proportion = int(sys.argv[3])
38
39image = pygame.image.load(file_in)
40w = image.get_width()
41h = image.get_height()
42sw, sh = get_dest_xy(w, h, proportion)
43
44# cria a surface com a proporção a ser alterada
45surface = pygame.display.set_mode((sw, sh))
46
47# chama a função pra redimensionar
48resize(image, surface, proportion)
49
50# salva a surface como nova imagem
51pygame.image.save(surface, file_out)
52
53pygame.display.set_caption(file_in)
54
55finish = False
56while not finish:
57    for event in pygame.event.get():
58        if event.type == pygame.QUIT:
59            finish = True
60        elif event.type == pygame.KEYDOWN:
61            if event.key == pygame.K_ESCAPE:
62                finish = True
63    pygame.display.update()
64pygame.quit()
65quit()