Informações pessoais Informações Pessoais
Ciência e Tecnologia Ciência e Tecnologia
Embarcadero Delphi Delphi
Para Sua Área Profissional Área Profissional

 

Delphi Delphi

Pgina sobre a Linguagem
de programao da Embarcadero

Efeitos de imagem no Delphi

Utilizando o Firemonkey para aplicar efeitos de imagem

22-03-2015

Efeitos de Imagem no Delphi

 

Vamos usar o framework Firemonkey do Delphi para \"brincarmos\" um pouco com a aplicao de alguns efeitos em figuras. Aqui, vou utilizar o XE2, mas voc pode obter os mesmos resultados utilizando verses posteriores. Crie uma nova aplicao, escolhendo o menu File > New > FireMonkey HD Application . Isso criar um formulrio para que possamos iniciar um novo projeto para a plataforma Windows.

A paleta Effects traz vrios efeitos que podemos adicionar aos componentes colocados no form. Portanto, no somente figuras podem ser modificadas. A maioria dos componentes aqui so descendentes da classe TEffect, enquanto outros descendem de TImageFXEffect (que, por sua vez, tambm descendente de TEffect). Vamos testar duas delas. Para isso, voc pode usar o mesmo projeto j existente e comentar as linhas que dizem respeito rotao da imagem. Voc pode fazer isso colocando as linhas existentes entre chaves:

 

{ ImageControl1.RotationAngle := TrackBar1.Value ;

Label1.Text := FormatFloat('#,##0.00',TrackBar1.Value ) + '';

}

 

Agora, coloque um componente BlurEffect sobre o componente ImageControl. Aparentemente, nada acontece e nenhum objeto novo visto no form. Este um componente no visual. Componentes no visuais no Delphi geralmente so vistos em tempo de design, mas no em tempo de execuo. Essa regra, no entanto, no se aplica ao FireMonkey, onde componentes no visuais, de fato, ficam totalmente invisveis. Mas voc pode perceber que ele est subordinado ao ImageControl, se observar a janela Structure View (Figura 1).

 

Figura 1 BlurEffect sob ImageControl

Figura 2 - Mostrando o efeito na imagem

O efeito desejado borrar a imagem. Selecione o componente atravs da janela Sturcture e modifique a propriedade Softness para 0. Selecione tambm False para a propriedade Enabled. Na TrackBar, deixe Max com 9. Para borrar a imagem, em cdigo, habilitaremos a propriedade Enabled para True e iremos incrementar o valor de Softness. Ento, no evento OnChange da TrackBar, coloque isso:

 

BlurEffect1.Softness := TrackBar1.Value ;

Label1.Text := FloatToStr(BlurEffect1.Softness);

 

Tambm no evento OnCreate do Form precisamos habilitar o recurso:

 

BlurEffect1.Enabled := True;

 

Pressione F9 e arraste a TrackBar para ver o efeito (Figura 2). Ressalto ento que os objetos descendentes de TEffect so todos no-visuais. Voc pode aplicar estes efeitos a qualquer componente visual do FireMonkey. Para usar um componente descendente de TEffect em tempo de design, tenha certeza de que ele ser um filho (child) do componente desejado, isto , estar subordinado ao componente cujo efeito se quer aplicar. Por exemplo, para aplicar um efeito num Edit, tenha certeza de que o efeito ser um componete-filho deste Edit. Para que isso acontea, o componente da paleta Effects deve ser arrastado e solto sobre o objeto desejado. Caso voc erre o alvo, no h problema: usando o Structure View, mova-o para baixo do objeto-alvo. Isso tornar o descendente da classe TEffect hierarquicamente subordinado a ele. Para remover um efeito, clique nele tambm usando a Structure View e pressione Delete no teclado.

 

Faamos, agora, um novo projeto para testar o efeito BloodTransitionEffect. Para isso, em um novo projeto FireMonkey HD, adicione um ImageControl, um OpenDialog (paleta Dialogs), dois Buttons e, novamente, uma TrackBar. Ajuste o ImageControl para que ocupe boa parte do form e coloque o boto e a TrackBar na parte inferior da janela. Mude o texto do primeiro boto para Abrir fig 1 e o do segundo para Abrir fig 2. Da paleta Effects, coloque um BloodTransitionEffect sobre o componente ImageControl. Ajuste sua propriedade Enabled para False e Progress para 0.

 

 

 

No evento OnClick do primeiro boto, coloque o seguinte:

 

if OpenDialog1.Execute then

ImageControl1.Bitmap.LoadFromFile(OpenDialog1.FileName );

 

No segundo boto, coloque o seguinte no evento OnClick:

 

if OpenDialog1.Execute then

BloodTransitionEffect1.Target.LoadFromFile(OpenDialog1.FileName );

 

 

Caixa de texto: Figura 3 - Efeito BloodTransition

Isso permitir que voc escolha duas figuras: uma sangrar at se transformar na outra, durante a transio do efeito. Target uma propriedade do objeto TBlodTransitionEffect, que nada mais do que um objeto da classe TBitmap (por isso, ele tambm tem o mtodo LoadFromFile( )). Voc pode at no escolher uma segunda figura, mas neste caso, o efeito da transio ser da figura 1 para ela mesma (embora seja possvel perceber a mudana mesmo assim).

 

No evento OnChange da TrackBar, digite:

 

BloodTransitionEffect1.Progress := TrackBar1.Value ;

 

Finalmente, no evento OnCreate do form, digite:

 

BloodTransitionEffect1.Progress := 0; [1]
BloodTransitionEffect1.Enabled := True;

 

Ao executar, escolha duas figuras e, depois, arraste a TrackBar. O efeito obtido deve ser semelhante ao mostrado na Figura 3. As figuras usadas foram duas das que podemos encontrar na pasta Amostra de Imagens, do Windows: Crisntemo.jpg e Deserto.jpg, mas voc poder usar qualquer figura que desejar.

 

Outro efeito interessante para aproveitar os recursos da GPU o de onda.

 

 

 

Num projeto separado, insira o controle ImageControl e, atravs da propriedade Bitmap, carregue uma figura qualquer (aqui, usei uma figura originalmente obtida em http://pensenao.wordpress.com/tag/amizade-animal/). Coloque tambm um Button e mude a propriedade Text para >. Depois, adicione imagem um componente WaveEffect. A propriedade WaveSize configura o tamanho da onda e Time controla as oscilaes atravs do tempo. Deixe Time com o valor 1 e, atravs de um Timer, vamos seguir modificando seu valor. Podemos conseguir isso facilmente, usando um componente Timer. Em seu evento OnChange, coloque o cdigo a seguir:

 

with WaveEffect1 do Begin

Enabled := True ;

Time := Time + 1;

End;

 

Aqui, estamos habilitando o efeito desejado, tornando sua propriedade Enabled para True. Ao mesmo tempo, Time vai sendo incrementado em uma unidade cada vez que o cdigo executado. O evento OnChange do Timer ocorrer a cada intervalo de tempo definido em sua propriedade Interval. Configure-a para 100 (o que significa 100 milissegundos), para que o efeito de onda no fique muito devagar, mas tambm no excessivamente rpido (voc pode alter-lo para outro valor, se quiser). No evento OnClick to boto, coloque o cdigo que ativar o timer e mudar o texto do boro para X:

 

if NOT Timer1.Enabled then begin

Button1.Text := X;

Timer1.Enabled := True;

end

Else begin

Button1.Text := >

Timer1.Enabled := False;

WaveEffect1.Time := 0;

End;

 

 

Se o Timer j estiver ativado, ento ele ser desativado, fazendo a propriedade Time do WaveEffect voltar a zero. Se voc quiser testar o projeto tambm alterando o tamanho da onde, pode colocar uma TrackBar e configurar seus valores Min e Max para 32 e 256, respectivamente (este o intervalo permitido para o tamanho da onda). No evento OnChange da TrackBar, atribua seu valor WaveSize:

 

WaveEffect1.WaveSize := TrackBar1.Value ;

 

 

Agora, uma questo esttica: voc pode desejar maximizar o aplicativo e, ao fazer isso, perceber que as dimenses da figura no iro acompanhar o layout do form. Para que os componentes se ajustem na tela adequadamente, devemos ter certeza de que o boto e a TrackBar continuaro prximos ao rodap e que a figura no ir sobrep-los. Para ajustar o boto e a TrackBar, configure a propriedade Anchor de ambos de modo que akBottom e akLeft fiquem como True, desmarcando akTop. Isso faz o alinhamento padro destes componentes ter como referencia as distncias da esquerda para a direita e de baixo para cima.

 

No ImageControl, como ele deve estender-se pela maior parte do form, deixe todos os valores de Anchors como True. Alm disso, volte propriedade Bitmap, clique em ... e, depois, no boto Fit. Isso far com que a figura dentro do componente se ajuste ao tamanho do ImageControl do contrrio, o componente acompanharia o tamanho do form, mas no seu contedo.

 

Fonte: ASMC


Usando Virtual-Key Codes - 27-03-2015

Usando a classe TDictionary - 26-03-2015

Sua Primeira Aplicao FireMonkey - 22-03-2015

Timer: criando um cronmetro - 10-09-2013

Criando um Tocador de udio com Playlist - 03-09-2013

Criando um Navegador Web com TWebBrowser - 03-09-2013

Personalizando o DBNavigator - 01-09-2013

Como Esmaecer um Formulrio - 24-09-2010

Procure um assunto especfico:  

 

  - Todos os artigos -