Boa tarde! Vamos lá:
Se a imagem está no seu TImage e vc quer salvar no banco de dados,
então pode usar esta função:

procedure GravaFoto(DataSet : TDataSet; BlobFieldName, FileName :
String; Nome: String);
var
  ext, mDir : string;
  JpegImage : TJPEGImage;
  bitmap:TBitMap;
begin
  if (DataSet.State in [dsEdit,dsInsert]) then
  begin
    mDir := ExtractFileDir(FileName);
    ext := UpperCase(ExtractFileExt(FileName));
    if (ext <> '.BMP') and (ext <> '.JPG') and (ext <> '.JPEG') then
    begin
      raise EAccessViolation.Create('Formato de imagem não suportado! '+
        'Formato suportado: Jpeg ou Bitmap');
        Abort;
    end;
    try
      JpegImage := TJpegImage.Create;
      Bitmap := TBitmap.Create;
      if (ext = '.BMP') then
      begin
        Bitmap.LoadFromFile(FileName);
        JpegImage.Assign(Bitmap);
        JpegImage.Compress;
      end
      else
        JpegImage.LoadFromFile(FileName);

      JpegImage.SaveToFile(Nome + '.JPG');
      (DataSet.FieldByName(BlobFieldName) as
      TBlobField).LoadFromFile(Nome + '.JPG');
      DataSet.Post;
      DeleteFile(PChar(FileName));
      DeleteFile(PChar(mDir + '.JPG'));
    finally
      Bitmap.Free;
      JpegImage.Free;
    end;
  end;
end;

vc deve chama-la mais ou menos assim:
GravaFoto(nomeDaTabela, nomeDoCampoDaTabela, NomeQueVcDaraAoArquivo);
Perceba que essa função já salva em formato JPG que ocupa menos espaço
no seu Banco de Dados

--Para exibir uma foto que está em um Banco de Dados eu uso a função:
procedure ExibeFoto(DataSet : TDataSet; BlobFieldName : String;
  ImageExibicao : TImage);
var
  BlobStream : TStream;
  JpegImage : TJPEGImage;
  bitmap:TBitMap;
begin
  BlobStream :=
DataSet.CreateBlobStream(DataSet.FieldByname(BlobFieldName), bmRead);
  if BlobStream.Size <> 0 then
  begin
      JpegImage  := TJPEGImage.Create;
      try
        JpegImage.LoadFromStream(BlobStream);
        ImageExibicao.Picture.Assign(JpegImage);
        ImageExibicao.Center:=true;
      finally
        BlobStream.Free;
        JpegImage.Free;
      end;
  end
  else
  begin
      Bitmap:=TBitMap.Create;
      Try
          Bitmap.Width:=1;
          Bitmap.Height:=1;
          ImageExibicao.Picture.Assign(BitMap);
          ImageExibicao.Center:=false;
      finally
          Bitmap.Free;
          BlobStream.Free;
      end;
  end;
end;

você deve chama-la mais ou menos assim:
ExibeFoto(NomeDaTabela, NomeDoCampo, NomeDoTImageParaExibicao);

Para Deletar uma imagem, eu faço isso via transação:
  try
    Transacao.TransactionID := 1;
    Transacao.IsolationLevel := xilREPEATABLEREAD;
    dmMain.sqlMain.StartTransaction(Transacao);
    dmCadastro.sdsTransacao.Close;
    dmCadastro.sdsTransacao.CommandType := ctQuery;
    dmCadastro.sdsTransacao.CommandText :=
      'delete from fotos where rf = 'instrução sql';
    dmCadastro.sdsTransacao.ExecSQL;
    dmMain.sqlMain.Commit(Transacao);
  except
    on Exc: Exception do
    begin
      Application.MessageBox('Ocorreu um erro durante a exclusão do
registro.',
        'Erro', MB_OK + MB_ICONSTOP);
      dmMain.sqlMain.Rollback(Transacao);
    end;
  end;

Para exportar a imagem para algum diretório do disco, eu uso a
seguinte função:
procedure ExibeFoto(DataSet : TDataSet; BlobFieldName : String;
  ImageExibicao : TImage);
var
  BlobStream : TStream;
  JpegImage : TJPEGImage;
  bitmap:TBitMap;
begin
  BlobStream :=
DataSet.CreateBlobStream(DataSet.FieldByname(BlobFieldName), bmRead);
  if BlobStream.Size <> 0 then
  begin
      JpegImage  := TJPEGImage.Create;
      try
        JpegImage.LoadFromStream(BlobStream);
        ImageExibicao.Picture.Assign(JpegImage);
        ImageExibicao.Center:=true;
      finally
        BlobStream.Free;
        JpegImage.Free;
      end;
  end
  else
  begin
      Bitmap:=TBitMap.Create;
      Try
          Bitmap.Width:=1;
          Bitmap.Height:=1;
          ImageExibicao.Picture.Assign(BitMap);
          ImageExibicao.Center:=false;
      finally
          Bitmap.Free;
          BlobStream.Free;
      end;
  end;
end;

Caso você nunca tenha salvo imagens em Danco de Dados e caso o banco
seja MySql(é o que uso) vai uma dica de lambuja:
No arquivo my.ini que geralmente está em C:\Arquivos de
programas\MySQL\MySQL Server 5.0,você deverá digitar na última linha:
max_allowed_packet=10M
para que assim ele suporte arquivos de tamanhos alem do normal(que é o
caso de imagens) e não exiba e mensagem de erro:
"MySQL server has gone away"

Outra coisa, observe que em nenhum momento uso o DbImage, pois como o
colega informou anteriormente, o DbImage não suporta JPG ou JPEG. Uso
sempre o TImage.

Espero ter ajudado, qualquer dúvida, poste ai pois caso eu não possa
ajudar, alguém poderá.
Fraterno abraço,
Carlos

Responder a