Ajuda - Busca - Membros - Calendário
Versão Completa: Pessoal Como Faço Para Por Uma Marca D'agua?
Fórum Script Brasil > Programação & Desenvolvimento > Delphi, Kylix
Rodolfo Neto
pessoal,
estou com uma duvida, eu estou capturando imagem de uma webcam e salvando em bmp, agora eu quero por uma marca d'agua nesta imagem.
como faço quem tiver algum ideia de unir imagem e uma delas ficar com uma certa transparencia(essa é minha duvida).
Micheus
QUOTE(Rodolfo Neto @ 16/03/2007 - 07:34) *
pessoal,
estou com uma duvida, eu estou capturando imagem de uma webcam e salvando em bmp, agora eu quero por uma marca d'agua nesta imagem.
como faço quem tiver algum ideia de unir imagem e uma delas ficar com uma certa transparencia(essa é minha duvida).
Veja se este código abaixo lhe serve. Não é grande não, só parece assim porque está comentado linha-a-linha wink.gif.
Meu código parte da idéia de que você utiliza uma marca em escala de cinza, onde os valores de cada componente (Red, Green e Blue) representam o percentual redutor
CODE
procedure PutWaterMark(Src, Dst :TGraphic; OffsetX, OffsetY :Integer);
type
  PRGB = ^TRGB;
  TRGB = record
    Blue,
    Green,
    Red :byte;
  end;
var
  BmpDst,
  BmpMark :TBitmap;
  X, Y :Integer;
  pxRGBSrc,
  pxRGBDst :PRGB;
begin
  BmpDst := TBitmap.Create;
  BmpMark := TBitmap.Create;
  try
   // transformamos imagem de origem em Bitmap
    BmpDst.Assign(Dst);
    BmpMark.Assign(Src);
   // varreremos todas as linhas da imagem marca d'água
    for y := 0 to BmpMark.Height - 1 do
    begin
     // inicializamos nosso apontador para o início da Scanline
     // referente a linha da imagem destino a ser alterada
      pxRGBDst := BmpDst.Scanline[OffsetY +y];
     // movemos o ponteiro para a posição X inicial, aonde será
     // aplicada a marka d'água
      Inc(pxRGBDst, OffsetX);
     // inicializamos nosso apontador para o início da Scanline
     // referente a linha da imagem origem - marca d'água
      pxRGBSrc := BmpMark.Scanline[y];
     // varreremos todas as colunas na linha atual da marca d'água
      for x := 0 to (BmpMark.Width - 1) do
      begin
       // calculamos a cor do novo pixel na imagem destino
       // baseado no percentual de cada componente de cor existente
       // na imagem da marca d'água - o efeito melhor é obtido utilizando
       // escala de cinza
        pxRGBDst.blue := Trunc(pxRGBDst.blue *(pxRGBSrc.blue /255));
        pxRGBDst.red := Trunc(pxRGBDst.red *(pxRGBSrc.red /255));
        pxRGBDst.green := Trunc(pxRGBDst.green *(pxRGBSrc.green /255));
       // posicionamos nos respectivos pontos a serem processados
        inc(pxRGBDst);
        inc(pxRGBSrc);
      end;
    end;
   // atualizamos imagem destino
    Dst.Assign(BmpDst);
  finally
    BmpDst.Free;
    BmpMark.Free;
  end;
end;
uma outra opção é modificar a parte que faz o cálculo da nova cor do ponto por:
CODE
Inc(pxRGBDst.blue, Trunc(pxRGBDst.blue *(1-pxRGBSrc.blue /255)));
        Inc(pxRGBDst.red, Trunc(pxRGBDst.red *(1-pxRGBSrc.red /255)));
        Inc(pxRGBDst.green, Trunc(pxRGBDst.green *(1-pxRGBSrc.green /255)));


utilizando...
CODE
procedure TForm1.Button1Click(Sender: TObject);
var
  BmpMark :TBitmap;
  FileStream :TFileStream;
begin
// inicializando bitmap a ser utilizado como marca d'água
  BmpMark := TBitmap.Create;
// associamos o arquivo de imagem ao stream
  FileStream := TFileStream.Create('marca.bmp', 0);
  try
   // carregamos a imagem para o componente bitmap
    BmpMark.LoadFromStream(FileStream);
   // aplicamos à Image1 a marca d'água na posição desejada - 100,100
   // como a imagem destino esperada pela função é do tipo TGraphic,
   // em "teoria" é possível passar qualquer imagem carregada que seja
   // descendente desta classe (TBitmap, TMetafile, TJPEGImage, ...)
    PutWaterMark(BmpMark, Image1.Picture.Graphic, 100, 100);
  finally
    FileStream.Free;
    BmpMark.Free;
  end;
end;


Abraços
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2012 Invision Power Services, Inc.