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

(Resolvido) Trafegar Imagem Com DataSnap


Manoel Zancheta

Pergunta

Olá.

Eu estou usando DataSnap e transferindo dados do cliente x servidor e servidor x cliente por Json e está funcionando bem. Agora me deparei com o problema de enviar uma imagem para ser gravada em um campo tipo Blob.

A sequência que faço é:

No lado Cliente:

1) Crio um objeto (produto, por exemplo);

2) Serializo este objeto com Json;

3) Envio para o servidor;

No lado Servidor:

1) Desserializo este Json e recupero o objeto produto;

2) Uso RRTI (um CRUD genérico) para persistir os dados na base de dados.

Observações:

1) Eu passo esta imagem por Json num stream;

2) Ocorre um erro de SQL, como se eu estivesse enviando uma string sem fechar aspas, limitada a 255 caracteres, tamanho do tipo string;

3) Na minha classe produto, o campo imagem, já tentei deixar com TMemoryStream, TBlobStream, TStringStream e não funciona;

4) Só funciona com imagens de resolução baixa, que ficam dentro do limite de 255 caracteres.

Qual seria a maneira certa de transferir estas imagens por Json?

Grato!

Manoel

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Tente isso:

Salvar diretamente a imagem no campo Blob

Stream := TMemoryStream.Create;
try
myImage.Picture.Graphic.SaveToStream(Stream);
Stream.Position := 0;
fieldAux.LoadFromStream(Stream);
finally
Stream.Free;
end;

Carregar do campo Blob para o componente image

Stream := TMemoryStream.Create;
try
fieldAux.SaveToStream(Stream);
Stream.Position := 0;
myImage.Picture.Graphic.LoadFromStream(Stream);
finally
Stream.Free;
end;

Veja tambem

http://www.activedelphi.com.br/forum/viewtopic.php?t=69002&sid=8d57952bc33a336e

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

O problema é que o stream de uma imagem el alta resolução é muito grande, daí há um problema na própria instrução SQL pois vai um comando INSERT como um valor enorme no campo imagem.

Então minha duvida é, como se trabalha com multicamadas enviando JPG com Json e persistindo a imagem na base de dados?

Link para o comentário
Compartilhar em outros sites

  • 0

O problema é que o stream de uma imagem em alta resolução é muito grande

antes de salvar a imagem no banco de dados voce deve transforma-la em jpg

voce tambem pode escalonar ( em percentual ) a imagem até que atinja um tamanho ideal

exemplo:

procedure setScaleImage(escala: TJPEGScale; const origem, destino: string);
var objJpeg : TJpegImage;  objbmp: TBitMap;
begin
  objJpeg := TJPegImage.Create;
  objJpeg.LoadFromFile(origem);
  objJpeg.Scale := escala;
  objbmp := TBitmap.Create;
  objbmp.Assign(objjpeg);
  objJpeg.Assign(objbmp);
  objjpeg.SaveToFile(destino);
  objJpeg.Free;
  objbmp.Free;
end;


procedure TFCadastro.SpeedButton4Click(Sender: TObject);

      function tbFileSize(const FileName: string): integer;
      var
        SR: TSearchRec;
        I: integer;
      begin
        I := FindFirst(FileName, faArchive, SR);
        try
          if I = 0 then
            Result := SR.Size
          else
            Result := -1;
        finally
          FindClose(SR);
        end;
      end;

var
  jpg: TJpegImage; x, i , tam, tam1 : integer;
begin
   x := 0;
   tam1 := 0;
   Image4.Picture.Graphic.SaveToFile('c:\FOTO.JPG');

   tam1 := tbFileSize('c:\FOTO.JPG');
   tam1 := tam1 div 1024;
   x := tam1 div 100;

   if x >= 3 then x := 2;

   if x < 1 then
      begin
         x := 1;
         perc := 0;
      end;   

   for i := 1 to x do
      begin
          tam := tbFileSize('c:\FOTO.JPG');
          tam := tam div 1024;

          if tam < 50 then exit;
          
          if i = 1 then
             tam1 := tam;

          perc := ((tam1 - tam) / tam1)* 100;

          jpg := TJpegImage.Create;
          jpg.LoadFromFile('C:\FOTO.jpg');
          clipboard.Assign(jpg);
          JPG.CompressionQuality := 40;
          JPG.Compress;
          JPG.SaveToFile('C:\FOTO.JPG');
          jpg.Free;
          setScaleImage(jsHalf,'C:\FOTO.JPG', 'C:\FOTO.JPG');
          FCadastro.Image4.Picture.Graphic.LoadFromFile('C:\FOTO.JPG');

          tam := tbFileSize('c:\FOTO.JPG');
          tam := tam div 1024;

          perc := ((tam1 - tam) / tam1)* 100;
          Edit2.Text := formatfloat(',0.00',perc) + ' %';
       end;

end;

voce tem que fazer algumas adaptações no seu código

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pro responder Jhonas.

Eu havia feito uns testes aqui acertando manualmente a resolução das fotos e funcionou.

Eu tinha pensado nisso, em achar algo pra redimensionar, mas queria esgotar as possibilidades de envio na resolução original.

Me diga uma coisa, eu consigo no processo contrário (quando o cliente recuperar esta imagem gravada no banco do servidor), voltar à resolução original dela?

Grato!

Link para o comentário
Compartilhar em outros sites

  • 0
Jhonas, comprimindo a imagem funcionou o envio de stream.
Agora preciso do processo contrário, converter esta string no usuário para JPG.
Pesquisei muita coisa mas nenhuma funcionou.


procedure SetJPGCompression(ACompression: integer; const AInFile: string; const AOutFile: string);
var
   iCompression: integer;
   oJPG: TJPegImage;
   oBMP: TBitMap;
begin

   { Forcar a Compressão para a faixa entre 1..100 }

   iCompression := abs(ACompression);

   if iCompression = 0 then

     iCompression := 1;

   if iCompression > 100 then

     iCompression := 100;



   { Cria as classes de trabalho Jpeg e Bmp }

   oJPG := TJPegImage.Create;

   oJPG.LoadFromFile(AInFile);

   oBMP := TBitMap.Create;

   oBMP.Assign(oJPG);



   { Fazer a Compressão e salva o novo arquivo }

   oJPG.CompressionQuality := iCompression;

   oJPG.Compress;

   oJPG.SaveToFile(AOutFile);



   { Limpar }

   oJPG.Free;

   oBMP.Free;

end;


function GetFileSizeEx(const FileName: string): LongInt;
var
  SearchRec: TSearchRec;
begin
  try
    if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
      Result := SearchRec.Size
    else Result := -1;
  finally
    FindClose(SearchRec);
  end;
end;

procedure TConsultaMedicos.AjustaImagem();
var
   Size: Real;
   Tamanho: String;
begin
   Size := GetFileSizeEx(opendialog1.FileName)/1024;

   NovoNome := opendialog1.FileName;

   Tamanho := Format('%f KB', [Size]);
   // Tamanho maior que 50 KB
   if Size > 50 then
      begin
         NovoNome := copy(opendialog1.FileName, 1, length(opendialog1.FileName) - 4) + '_new.jpg';
         SetJPGCompression(15, opendialog1.FileName, NovoNome);
   end;
end;
Editado por Manoel Zancheta
Link para o comentário
Compartilhar em outros sites

  • 0

faça dessa forma

procedure TForm1.Button1Click(Sender: TObject);
var BS: TClientBlobStream;
    Imagem: TJPEGImage;
begin
  Image1.Picture := nil;

  // campo da tabela onde esta a imagem
  BS := TClientBlobStream.Create(CDS_TabelaFOTO, BMREAD);

  if BS.Size > 0 then // Verifica se o registro tem imagens gravadas
  begin
    Imagem := TJPEGImage.Create;
    Imagem.LoadFromStream(BS);
    Image1.Stretch := true;
    Image1.Picture.Assign(Imagem); // joga a imagem do banco para o componente
    BS.FREE;
    Imagem.Free;
  end
end;

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...