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

Gravar fisicamente img convertida em campo blob


DiabloX3

Pergunta

Olá, tenho pesquisado mas por se tratar de um tópico o qual estou juntando 2 combinações de programação que encontrei seja mais difícil uma resposta exata. O caso é que tenho um form com cadastro e nele posso adicionar a foto do cidadão. Quero gravar e depois visualizá-la de volta no form ou gerar o relatório com ela e imprimi-lá.

A diferença é que quando clico no botão selecionar foto eu vou fazer uma verificação da extensão da minha img. Se ela for ".jpg" eu simplesmente quero gravá-la no BD.

Caso seja qualquer outra extensão eu quero convertê-la antes de gravar.

Estou usando Delphi 7, Firebird 2.5, Campos Blob sub_type 0, clientdataset e dbexpress

Botão Selecionar foto
-----------------

var
  ImageJPG: TJPEGImage;
  BlobStream: TStream;
  FileStream: TFileStream;
begin 

if OpenPictureDialog1.Execute then
    if (ExtractFileExt(OpenPictureDialog1.FileName) = '.jpg') or (ExtractFileExt(OpenPictureDialog1.FileName) = '.jpeg') then
    begin
      FileStream := TFileStream.Create(OpenPictureDialog1.FileName,
        fmOpenRead or fmShareDenyWrite);
      BlobStream := dmCadastro.cdsCadAlu.CreateBlobStream(dmCadastro.cdsCadAluALU_FOTO,bmWrite);
      ImgFoto.Picture.LoadFromFile(OpenPictureDialog1.FileName);
      edtCaminhoImg.Text := OpenPictureDialog1.FileName;
      try
        BlobStream.CopyFrom(FileStream,FileStream.Size);
      finally
        FileStream.Free;
        BlobStream.Free;
      end;
    end else
    begin
      ImageJPG := TJPEGImage.Create;
      try
        if ConvertImage(OpenPictureDialog1.FileName, ImageJPG) then
        begin
          ImgFoto.Picture.Assign(ImageJPG);
          dmCadastro.cdsCadAluALU_FOTO.Assign(ImageJPG);
          edtCaminhoImg.Text := OpenPictureDialog1.FileName;
        end;
      finally
        ImageJPG.Free;
      end;
  end;
Função usada pra converter imagem
---------------

function TfrmCadAlu.ConvertImage(SrcName: string;
  DstPic: TGraphic): Boolean;
var
  Picture: TPicture;
  ImageBMP: TBitmap;
begin
  Result := False;
  Picture := TPicture.Create;
  try
    Picture.LoadFromFile(SrcName);
    ImageBMP := TBitmap.Create;
    try
      ImageBMP.Width := Picture.Width;
      ImageBMP.Height := Picture.Height;
      ImageBMP.Canvas.Draw(0, 0, Picture.Graphic);
      DstPic.Assign(ImageBMP);
      Result := True;
    finally
      ImageBMP.Free;
    end;
  finally
    Picture.Free;
  end;
end;

Não estou muito certo sobre o funcionamento dela e por isso não estou muito confiante, por isso a dúvida. Como devo fazer pra gravar sempre JPG no banco? Resolvi assim pra tentar não deixar o banco muito grande

Abraço

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

o caminho é esse mesmo.

veja outros posts a respeito do assunto

http://scriptbrasil.com.br/forum/index.php...mp;highlite=jpg

essa rotina pode te ajudar

Converter Bitmap para JPeg

Inclua na seção uses: Graphics, JPeg 
O procedimento abaixo converte um arquivo de imagem Bitmap
para JPeg. O arquivo JPeg terá o mesmo nome do arquivo Bitmap, 
mas com a extensão jpg.

procedure ConverterBmpParaJPeg(Arquivo: string);
var
  Bmp: TBitmap;
  JPeg: TJPegImage;
begin
  Bmp := TBitmap.Create;
  try
    Bmp.LoadFromFile(Arquivo);
    JPeg := TJPegImage.Create;
    try
      JPeg.CompressionQuality := 100; { Qualidade: 100% }
      JPeg.Assign(Bmp);
      JPeg.SaveToFile(ChangeFileExt(Arquivo, '.jpg'));
    finally
      JPeg.Free;
    end;
  finally
    Bmp.Free;
  end;
end;

Exemplo de uso:

ConverterBmpParaJPeg('c:\diretorio\arquivo.bmp');

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Agora o link está ok!

Encontrei aí um tópico legal que você fala sobre compressão de imagem e já adaptei pro meu caso. Só que fiquei com uma dúvida.

Analisando o código que postei acima: eu tenho um IF se a imagem for .jpg ou .jpeg e um else se for outra extensão. No meu caso eu tenho a variável TJPEGImage declarada mas eu apenas utilizo-a no ELSE, ou seja, se não for .JPG. Acontece que as duas linhas que adaptei no código só funcionam (aparentemente) com esse tipo de variável

ImageJPG.CompressionQuality := 75;
ImageJPG.Compress;

Só que eu queria deixar essa compressão habilitada também no caso da JPG ser muito grande e assim diminuí-la. 75 achei uma qualidade boa e reduziu e muito o tamanho de umas imagens BMP que eu tinha aqui. Queria fazer o mesmo com o JPG mas eu utilizo TStream e TFileStream no prmeiro IF.

Como posso definir qualidade então?

Abraço

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,3k
×
×
  • Criar Novo...