Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lívio Bruno

Fade in/out

Recommended Posts

Pessoal tenho um form. Nesse form tenho dois botões(button1 e button2) e uma imagem(image1). Tenho um código que faz com que ao clicar no button1, essa imagem vai perdendo as cores até ficar totalmente sem nenhuma cor, ou seja, preta. Agora eu queria, se possível, quando clicasse no outro botão essa imagem voltasse as cores originais. Esse código já me ajudaria mas, a intenção é fazer o seguinte:

 

Tenho uma imagem onde:

0% = cor preta

e

100% = cor original

 

A imagem inicia com 50% da cor original

 

Quando eu clicar no button1 a imagem perde 25% da cor, se eu clicar de novo ela perde mais 25%, quando eu clicar no button2 o código reconhece a pocentagem atual e retorna para a porcentagem da imagem anterior ou seja, ela perdeu 50% da cor e voltou ao estado de 25% de cor perdida.

Quando eu clicar no button2 a imagem ganha 25% da cor, se eu clicar de novo ela ganha mais 25%, quando eu clicar no button1 o código reconhece a pocentagem atual e retorna para a porcentagem da imagem anterior ou seja, ela ganhou 50% da cor e voltou ao estado de 25% de cor ganha.

 

O código que eu citei no início está aqui:

 

procedure TForm1.Button1Click(Sender: TObject);

 

procedure FadeOut(const BMP:TImage; Pause:integer) ;

var

BytesPorScan : integer;

w,h : integer;

p : pByteArray;

counter : integer;

 

begin

{This only works with 24 or 32 bits bitmaps}

If Not (BMP.Picture.Bitmap.PixelFormat

in [pf24Bit, pf32Bit])

then raise exception.create

('Error, bitmap format not supported.') ;

 

try

BytesPorScan:=

Abs(Integer(BMP.Picture.Bitmap.ScanLine[1])-

Integer(BMP.Picture.Bitmap.ScanLine[0])) ;

except

raise exception.create('Error') ;

end;

 

//Diminuir o RGB para cada pixel único

for counter:=1 to 256 do

begin

for h:=0 to BMP.Picture.Bitmap.Height-1 do

begin

P:=BMP.Picture.Bitmap.ScanLine[h];

for w:=0 to BytesPorScan-1 do

if P^[w] >0 then P^[w]:=P^[w]-1;

end;

Sleep(Pause) ;

BMP.Refresh;

end;

end; //procedure FadeOut

begin //button1_click

FadeOut(Image1,5) ;

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal tenho um form. Nesse form tenho dois botões(button1 e button2) e uma imagem(image1). Tenho um código que faz com que ao clicar no button1, essa imagem vai perdendo as cores até ficar totalmente sem nenhuma cor, ou seja, preta. Agora eu queria, se possível, quando clicasse no outro botão essa imagem voltasse as cores originais. Esse código já me ajudaria mas, a intenção é fazer o seguinte:

 

Tenho uma imagem onde:

0% = cor preta

e

100% = cor original

 

A imagem inicia com 50% da cor original

 

Quando eu clicar no button1 a imagem perde 25% da cor, se eu clicar de novo ela perde mais 25%, quando eu clicar no button2 o código reconhece a pocentagem atual e retorna para a porcentagem da imagem anterior ou seja, ela perdeu 50% da cor e voltou ao estado de 25% de cor perdida.

Quando eu clicar no button2 a imagem ganha 25% da cor, se eu clicar de novo ela ganha mais 25%, quando eu clicar no button1 o código reconhece a pocentagem atual e retorna para a porcentagem da imagem anterior ou seja, ela ganhou 50% da cor e voltou ao estado de 25% de cor ganha.

 

O código que eu citei no início está aqui:

 

procedure TForm1.Button1Click(Sender: TObject);

 

procedure FadeOut(const BMP:TImage; Pause:integer) ;

var

BytesPorScan : integer;

w,h : integer;

p : pByteArray;

counter : integer;

 

begin

{This only works with 24 or 32 bits bitmaps}

If Not (BMP.Picture.Bitmap.PixelFormat

in [pf24Bit, pf32Bit])

then raise exception.create

('Error, bitmap format not supported.') ;

 

try

BytesPorScan:=

Abs(Integer(BMP.Picture.Bitmap.ScanLine[1])-

Integer(BMP.Picture.Bitmap.ScanLine[0])) ;

except

raise exception.create('Error') ;

end;

 

//Diminuir o RGB para cada pixel único

for counter:=1 to 256 do

begin

for h:=0 to BMP.Picture.Bitmap.Height-1 do

begin

P:=BMP.Picture.Bitmap.ScanLine[h];

for w:=0 to BytesPorScan-1 do

if P^[w] >0 then P^[w]:=P^[w]-1;

end;

Sleep(Pause) ;

BMP.Refresh;

end;

end; //procedure FadeOut

begin //button1_click

FadeOut(Image1,5) ;

end;

 

 

procedure BlendBitmap(Source :TBitmap; Dest :TImage; BlendColor :TColor; BlendValue :byte);
var
  X, Y,
  R, G, B,
  PR, PG, PB :Integer;
  blColor :LongInt;
  scColor :TColor;
  Percent :Single;
  tmpBitmap :TBitmap;
begin
  if BlendValue > 100 then
    BlendValue := 100;
  tmpBitmap := TBitmap.Create;
  try
  // copia bitmap de origem para o temporário (o qual será modificado)
    tmpBitmap.Assign(Source);
  // Calcula percentual a aplicar
    Percent := BlendValue/100;
  // obtém as componentes da cor da imagem fonte
    blColor := ColorToRGB(BlendColor);
    R := (blColor and $000000FF);        // Red
    G := (blColor and $0000FF00) shr 8;  // Green
    B := (blColor and $00FF0000) shr 16; // Blue
  // varre todo o bitmap de origem
    for X := 0 to tmpBitmap.Width -1 do
      for Y := 0 to tmpBitmap.Height -1 do
      begin
       // obtém as componentes da cor da imagem fonte
        scColor := tmpBitmap.Canvas.Pixels[X, Y];
        PR := (scColor and $000000FF);          // % Red
        PG := ((scColor and $0000FF00) shr 8);  // % Green
        PB := ((scColor and $00FF0000) shr 16); // % Blu
       // calcula o nível de mistura e determina novo valor para os componentes do pixel
        PR := Trunc(R +((PR -R) *Percent));
        PG := Trunc(G +((PG -G) *Percent));
        PB := Trunc(B +((PB -B) *Percent));
      // atribui o pixel calculado ao bitmap
        tmpBitmap.Canvas.Pixels[X, Y] := RGB(PR ,PG, PB);
      end;
   // copia o bitmap temporário para o destino
    Dest.Picture.Bitmap.Assign(tmpBitmap);
  finally
    tmpBitmap.Free;
  end;
end;


var
  Valor :Byte;
  Blending :Boolean;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Valor < 100 then
  begin
    if not Blending then
    begin
      Blending := True;
      BlendBitmap(Image1.Picture.Bitmap, Image2, Self.Color, Valor);
      Inc(Valor, 4);
      Blending := False;
     end;
  end else
    Timer1.Enabled := False;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Valor := 0;
  Blending := False;
  Timer1.Enabled := True;
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.