Guest Rodolfo Neto Postado Março 16, 2007 Denunciar Share Postado Março 16, 2007 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). Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Março 17, 2007 Denunciar Share Postado Março 17, 2007 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 ;).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 redutorprocedure 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: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... 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Guest 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).
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.