Dando um zoom em imagens

Autor: Christiano Lima Santos

Boa noite!

Bem, desta vez, vamos ver como fazer um efeito de zoom para as imagens.

Em primeiro lugar, definamos três coisas:

Zoom -> Efeito de escalonamento proporcional da imagem;
Zoom In -> Efeito de aumento do tamanho da imagem;
Zoom Out -> Efeito de redução do tamanho da imagem.

Seria ridículo se vocês saíssem daqui sem saber isso, né? =)

Bem, agora sim.
Estou falando tudo isso, porque algum tempo atrás estudei os efeitos de Zoom e consegui fazer isso de um jeito bem simples.
O caso é que, dada uma imagem de tamanho largura x altura, nós queremos exibir ela alterada por um determinado fator de zoom centralizada numa outra superficie de tamanho largura x altura.

O que vamos precisar é simplesmente varrer toda a imagem destino (ImgDest) e sair verificando qual a cor do pixel correspondente na imagem origem (ImgOrg).

Agora, a dúvida é: como saber qual o pixel de onde pegar a cor da ImgOrg?

Bem, como a gente falou, a imagem deve ficar centralizada.
Logo o pixel (largura/2, altura/2) de ImgDest deve ser igual ao pixel (largura/2, altura/2) de ImgOrg.

Agora, pensemos juntos. Se eu tenho um pixel de Img que está a uma distância X do centro, ao dobrar a imagem (zoom = 2), a que distância ela estará do centro? 2X.
Do mesmo jeito, se eu reduzir à metade o tamanho da imagem (zoom = 0.5), a que distância ficará? 0.5X.

Viu só? Da ImgOrg para a ImgDest, a distância para o centro fica multiplicada pelo fator zoom.
Mas nós falamos que vamos varrer a ImgDest, ou seja, nós vamos sair de ImgDest para achar valor em ImgOrg, então a gente aplica a operação inversa: divide a distância ao centro por zoom.

Então o que nós vamos ter que fazer é achar a posição relativa de cada pixel ao centro da ImgDest, dividir pelo fator de zoom, somar então novamente o valor do ponto central e então nós teremos achado o pixel correspondente na ImgOrg!

Ae vocês me perguntam… Desse jeito, eu posso pegar um pixel fora da ImgOrg! O que fazer nesse caso?
Simples: o Delphi automaticamente estabelece cor Preta caso o pixel não exista, mas daí vocês podem tratar dentro do código, primeiro verificando se aquele pixel realmente está nos limites, se não estiver, usam uma cor qualquer para plotar na ImgDest.

Ah! E já que vamos trabalhar com divisões, zoom tem que ser diferente de zero!

Bem, o algoritmo no Delphi fica da seguinte forma…

If zoom 0.0 Then
	exit;
for x := 0 to largura-1 do
	for y := 0 to altura-1 do
		ImgDest.Canvas.Pixels[x,y] := ImgOrg.Canvas.Pixels[
											trunc((x - largura/2)/zoom + largura/2),
											trunc((y - altura/2)/zoom + altura/2)];

Viu só como é simples?

Caramba, e eu sempre achando que era bem mais complicado!

Bem, pra concluir, vejam aqui duas imagens exibindo o resultado final…

Essa é a imagem original, vamos agora aplicar a ela um fator de zoom 3 (vamos ter uma imagem resultado correspondente a esse retângulo marcado aí no meio…)

Pronto, aqui está a imagem resultado, lembrando-se que aplicamos um fator de zoom 3.

Então já fica perceptível que para valores absolutos de zoom entre 0 e 1, teremos efeito zoom out (a imagem fica reduzida) e para valores absolutos de zoom maiores que 1, zoom in.

Mas, porque eu falei em valores absolutos?

Simples, porque quando zoom é positivo, a imagem vai ficar normal, mas… quando zoom é negativo, ocorre zoom in/out, mas a imagem final fica invertida (rotacionada 180 graus). Por quê? É só lembrar que nós dividimos por zoom para encontrar o pixel correspondente, nossa origem ( 0, 0 ) é o centro da imagem e, quando for negativo o zoom, irei portanto pegar o pixel do lado oposto da imagem (tanto na horizontal quanto na vertical) .

Bem, é só isso por enquanto, espero que tenham gostado.

Um abraço e até breve!

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS
 

Leave a Reply

Your email address will not be published. Required fields are marked *

Email
Print