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

.
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