Ir para conteúdo
Fórum Script Brasil
  • 0

Webcam, Bd Mysql 5 E Delphi 7, Conectando-os


schaukoski

Pergunta

Olá, Muito bom dia à todos!

Após muita procura na internet, sobre , como fazer para capturar uma imagem da minha webcam,do meu programa em delphi, eu acabei achando um exemplo do Jacson Soares, mas ele vem sem os componentes.

Alguém tem alguma experiência com isso?....

eu não tenho a menor idéia.. criei um campo BLOB no meu BD, e coloquei um DBImage.

mas, qual componente para ligar a webcam com o delphi? eu estou bem perdido em relação a isso, se alguém tiver alguma luz, eu agradeço.

Obrigado !

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Olá pessoal, eu achei o componente TWAIN, um ÓTIMO componente.. consegui fazer tudo o que eu queria!

unico problema, é que no meu cadsatro as fotos estao vindo 320x120, eu gostaria de deixar ele default 160x120, mas toda vez que abro para tirar a foto ele vem tamanho gigante.

issoi depende de cada webcam?! como que é?! porque na configuracao dessa webcam pelo menos, eu não consegui deixar default 120x160

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

opa

Use esta rotina pra você criar thumbnails...

procedure MakeThumbNail(aSource, aDest: TBitmap; iWidth, iHeigth: Integer);
type
  PRGB24 = ^TRGB24;
  TRGB24 = packed record
    B: Byte;
    G: Byte;
    R: Byte;
  end;
var
  x, y, ix, iy: integer;
  x1, x2, x3: integer;

  xscale, yscale: single;
  iRed, iGrn, iBlu, iRatio: Longword;
  p, c1, c2, c3, c4, c5: tRGB24;
  pt, pt1: pRGB24;
  iSrc, iDst, s1: integer;
  i, j, r, g, b, tmpY: integer;

  RowDest, RowSource, RowSourceStart: integer;
  w, h: integer;
  dxmin, dymin: integer;
  ny1, ny2, ny3: integer;
  dx, dy: integer;
  lutX, lutY: array of integer;

begin
  if aSource.PixelFormat <> pf24bit then
  aSource.PixelFormat := pf24bit;

  if aDest.PixelFormat <> pf24bit then
  aDest.PixelFormat := pf24bit;

  aDest.Width := iWidth;
  aDest.Height := iHeigth;
  w := iWidth;
  h := iHeigth;

  if (aSource.Width <= iWidth) and (aSource.Height <= iHeigth) then
  begin
    aDest.Assign(aSource);
    exit;
  end;

  iDst := (w * 24 + 31) and not 31;
  iDst := iDst div 8;
  iSrc := (aSource.Width * 24 + 31) and not 31;
  iSrc := iSrc div 8;

  xscale := 1 / (w / aSource.Width);
  yscale := 1 / (h / aSource.Height);

  SetLength(lutX, w);
  x1 := 0;
  x2 := trunc(xscale);
  for x := 0 to w - 1 do
  begin
    lutX[x] := x2 - x1;
    x1 := x2;
    x2 := trunc((x + 2) * xscale);
  end;

  SetLength(lutY, h);
  x1 := 0;
  x2 := trunc(yscale);
  for x := 0 to h - 1 do
  begin
    lutY[x] := x2 - x1;
    x1 := x2;
    x2 := trunc((x + 2) * yscale);
  end;

  dec(w);
  dec(h);
  RowDest := integer(aDest.Scanline[0]);
  RowSourceStart := integer(aSource.Scanline[0]);
  RowSource := RowSourceStart;
  for y := 0 to h do
  begin
    dy := lutY[y];
    x1 := 0;
    x3 := 0;
    for x := 0 to w do
    begin
      dx := lutX[x];
      iRed := 0;
      iGrn := 0;
      iBlu := 0;
      RowSource := RowSourceStart;
      for iy := 1 to dy do
      begin
        pt := PRGB24(RowSource + x1);
        for ix := 1 to dx do
        begin
          iRed := iRed + pt.R;
          iGrn := iGrn + pt.G;
          iBlu := iBlu + pt.B;
          inc(pt);
        end;
        RowSource := RowSource - iSrc;
      end;
      iRatio := 65535 div (dx * dy);
      pt1 := PRGB24(RowDest + x3);
      pt1.R := (iRed * iRatio) shr 16;
      pt1.G := (iGrn * iRatio) shr 16;
      pt1.B := (iBlu * iRatio) shr 16;
      x1 := x1 + 3 * dx;
      inc(x3, 3);
    end;
    RowDest := RowDest - iDst;
    RowSourceStart := RowSource;
  end;

  if aDest.Height < 3 then exit;

  s1 := integer(aDest.ScanLine[0]);
  iDst := integer(aDest.ScanLine[1]) - s1;
  ny1 := Integer(s1);
  ny2 := ny1 + iDst;
  ny3 := ny2 + iDst;
  for y := 1 to aDest.Height - 2 do
  begin
    for x := 0 to aDest.Width - 3 do
    begin
      x1 := x * 3;
      x2 := x1 + 3;
      x3 := x1 + 6;

      c1 := pRGB24(ny1 + x1)^;
      c2 := pRGB24(ny1 + x3)^;
      c3 := pRGB24(ny2 + x2)^;
      c4 := pRGB24(ny3 + x1)^;
      c5 := pRGB24(ny3 + x3)^;

      r := (c1.R + c2.R + (c3.R * -12) + c4.R + c5.R) div -8;
      g := (c1.G + c2.G + (c3.G * -12) + c4.G + c5.G) div -8;
      b := (c1.B + c2.B + (c3.B * -12) + c4.B + c5.B) div -8;

      if r < 0 then r := 0 else if r > 255 then
      r := 255;

      if g < 0 then g := 0 else if g > 255 then
      g := 255;

      if b < 0 then b := 0 else if b > 255 then
      b := 255;

      pt1 := pRGB24(ny2 + x2);
      pt1.R := r;
      pt1.G := g;
      pt1.B := b;
    end;
    inc(ny1, iDst);
    inc(ny2, iDst);
    inc(ny3, iDst);
  end;
end;

Pra usar seria assim, exemplo

MakeThumbnail(Variavel com a foto, Variavel que vai receber a foto menor, Comprimento, Altura);

var

a, b: TBitmap;

begin

a := TBitmap.Create;

b := TBitmap.Create;

a := Recebe a foto da webcam;

makethumbnail(a, b, 160, 120);

b agora é a foto da webcam no tamanho 160x120

Viu, se puder compartilhar esse componente ou biblioteca

Twain que usou para capturar a foto da webcam, várias

pessoas procuram por isso, se puder passar o site ou

até mesmo o componente todo mundo vai agradecer

auhauha

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Churc, Obrigado pela atenção.

Eu resolvi este problema com a propriedade Stretch, do meu DBIMAGE ... isto está Ok.

Mas como " Nada é facinho , facinho", mais um problema surgiu.

Eu adicionei um SpeedButton, ao lado, que pretendo colocar uma rotina, para o usuário, selecionar qualquer foto do seu computador , ou seja, quando pressionar o SB, abrir uma caixa de procura ( dakelas quando voce vai salvar algo etc.. ), e quando selecionado o arquivo JPEG, ou BMP, o DBIMAGE receber esta Imagem.

Eu não tenho idéia de como abrir um form de procura dakeles de salvar, se voce puder me ajudar, agradeço!

Obrigado, " até-mais".

Link para o comentário
Compartilhar em outros sites

  • 0
unico problema, é que no meu cadsatro as fotos estao vindo 320x120, eu gostaria de deixar ele default 160x120, mas toda vez que abro para tirar a foto ele vem tamanho gigante.
Eu resolvi este problema com a propriedade Stretch, do meu DBIMAGE ... isto está Ok.
Se não estou enganado, isto resolve o problema da visualização. No cadastro, como você citou antes, as imagens continuarão com 320x120. Se você quizer armazenar em outro tamanho teria que utilizar o procedimento que Churc postou anteriormente.

Editado por Micheus em 11/02/2007

Há uma outra opção para gerar o tumbnails, que é através do método StretchDraw do Canvas. Eu não estava certo se haveria alguma diferença no resultado final, mas o Churc deu uma conferida e disse ser o mesmo. Então, utilizando o mesmo procedimento implementado anteriormente, poderiamos escrever assim:

procedure MakeThumbNail2(aSource, aDest: TBitmap; iWidth, iHeigth: Integer);
begin
  aDest.PixelFormat := aSource.PixelFormat;
  aDest.Width := iWidth;
  aDest.Height := iHeigth;
  aDest.Canvas.StretchDraw(Rect(0, 0, iWidth, iHeigth), aSource);
end;

Abraços

Editado por Micheus
Link para o comentário
Compartilhar em outros sites

  • 0

Sim, Tudo bem.

Eu não intendi muito bem esse thumbnails, esse que você postou Micheus, aDest, seria uma variavel bitmap?

Se você souber, gostaria de dizer, qual o tamanho máximo do MySQL no campo BLOB?... Se este método de diminuir realmente o tamanho da imagem, seria muito bom, pois eu não teria que fazer uma outra rotina de cadastro, com busca em diretorio, salvar em diretório com nome de variável, isso é um pouco complicado.

Respondendo ao Churc, eu posso compartilhar o Twain sim, inclusive posso ajudar a instalar se alguém quiser.

meu MSN está aqui: dudumoura_@hotmail.com

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0
Eu não intendi muito bem esse thumbnails, esse que você postou Micheus, aDest, seria uma variavel bitmap?
Sim.

Se você souber, gostaria de dizer, qual o tamanho máximo do MySQL no campo BLOB?
De acordo com a documentação do MySQL (link - Data Type Storage Requirements), pode ser de até 4GB, conforme tipo utilizado:

TINYBLOB, TINYTEXT: 2^8 ou 256 Bytes

BLOB, TEXT: 2^16 ou 65536 bytes (64 KB)

MEDIUMBLOB, MEDIUMTEXT: 2^24 ou 16777216 bytes (16 MB)

LONGBLOB, LONGTEXT: 2^32 ou 4294967296 bytes (4 GB)

... Se este método de diminuir realmente o tamanho da imagem, seria muito bom, pois eu não teria que fazer uma outra rotina de cadastro, com busca em diretorio, salvar em diretório com nome de variável, isso é um pouco complicado.
Sim, ele realmente diminui o tamanho da imagem. Mas a abordagem da figura armazenada em um diretório (seguro) também pode ser interessante quando as imagens são grandes, evitando estufar um banco que possua milhares de registros.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Boa madrugada companheiros,

Sem querer ferir susceptibilidades, não vejo porque não postar aqui o link. Pode ser uma questão de opção, mas ainda assim, acho que deveria contribuir com este seu achado importante. Espero que não me tome a mal Schaukoski, até porque você já me ajudou bastante outrora, mas sei o que custa procurar... e fica chato e demorado estar a incomoda-lo no seu email. Mas respeito a sua decisão.

Em todo caso, apanhei algo interessante:

http://delphi.about.com/od/graphics/l/aa030299.htm

Abraço a todos...

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Visitante

xD pessoal... presente para todos... peguei o q vocês fizeram ai, e fiz isso oh:

procedure TFrmMenuPrincipal.DBImageCliClick(Sender: TObject);
Var PHOTO, PHOTO2 : TBitmap;
begin
  If  CBCliCidade.Text = '' Then
    Begin
      Exit;
    end
  Else If OpenPictureDialog.Execute Then
    Begin
      PHOTO := TBitmap.Create;
      PHOTO2 := TBitmap.Create;
      PHOTO.LoadFromFile(OpenPictureDialog.FileName);
      PHOTO2.LoadFromFile(OpenPictureDialog.FileName);
      PHOTO2.PixelFormat := PHOTO.PixelFormat;
      PHOTO2.Height := 115;
      Photo2.Width := 115;
      PHOTO2.Canvas.StretchDraw(Rect(0, 0, 155, 155), PHOTO);
      Clipboard.Assign(PHOTO2);
      DBImageCli.PasteFromClipboard;
      PHOTO.Free;
    end;
end;

então... isso pega uma imagem q o user escolhe... e redimencioniza para 115x155 pixels e poem na db... ai pra salvar dps so dar um .post...

se quiser mudar o heigth ou width da img,,, basta mudar os valores ali no cod onde ta 155 e 155...

abraços e ty xD

Editado por Micheus
Adicionado o delimitador de código [code] [/code]
Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...