Reduzir imagem pelo Delphi

Delphi

Firebird

11/09/2015

Bom dia a todos,

possuo um Webservice em DataSnap que utilizo para fazer a integração entre a retaguarda do cliente e meu aplicativo Android (JAVA).


As informações estão trafegando e funcionando normalmente. Eis que agora surgiu a necessidade de enviar a imagem do produto para o meu aplicativo.

Pesquisei e encontrei formas de fazer isso.

Utilizei o post
transferir arquivos entre aplicações Cliente/Servidor para recuperar a imagem do banco e enviar para a aplicação.

function TServerMethodos1.EnviarFotoTablet(codProd: String): TJSONArray;
 var
  sBytesArquivo, sNomeArquivo : string;
  oSSArquivoStream: TStringStream;
  iTamanhoArquivo, iCont: Integer;
  pDirArquivo: string;
begin
   try
    cdsFotoProduto.Close;
    cdsFotoProduto.CommandText := 'SELECT FOTO FROM PRODUTO P WHERE P.CODPROD=:CODPROD';
    cdsFotoProduto.Params.ParamByName('CODPROD').AsString := codProd;
    cdsFotoProduto.Open;
    begin
       pDirArquivo := cdsFotoProduto.FieldByName('FOTO').AsString;
       if pDirArquivo <> '' then
         QualityResizeBitmap(pDirArquivo, pDirArquivo, 800,600);
         begin
            Result := TJSONArray.Create; // Instanciando o objeto JSON que conterá o arquivo serializado

            oSSArquivoStream := TStringStream.Create(pDirArquivo); // Instanciando o objeto stream que carregará o arquivo para memoria
            iTamanhoArquivo := oSSArquivoStream.Size; // pegando o tamanho do arquivo

            sBytesArquivo := '';

            //Fazendo um lanço no arquivo que está na memoria para pegar os bytes do mesmo
            for iCont := 0 to iTamanhoArquivo - 1 do
               begin
                 //A medida que está fazendo o laço para pegar os bytes, os mesmos são jogados para
                //uma variável do tipo string separado por ","
                  sBytesArquivo := sBytesArquivo + IntToStr(oSSArquivoStream.Bytes[iCont]) + ', ';
               end;

               //Como é colocado uma vírgula após o byte, fica sempre sobrando uma vígugula, que é deletada
               Delete(sBytesArquivo, Length(sBytesArquivo)-1, 2);

               //Adiciona a string que contém os bytes para o array JSON
               Result.Add(sBytesArquivo);

               // Adiciona para o array JSON o tamanho do arquivo
               Result.AddElement(TJSONNumber.Create(iTamanhoArquivo));

               //Extrai o nome do arquivo
               sNomeArquivo := ExtractFileName(pDirArquivo);
              //Adiciona na terceira posição do array JSON o nome do arquivo
               Result.AddElement(TJSONString.Create(sNomeArquivo));
         end
         else
           begin
              Result := TJSONArray.Create;
              oSSArquivoStream := TStringStream.Create();
              //ShowMessage(Result.ToString);
           end;
    end;
   finally
        oSSArquivoStream.Free;
    end;
end;



Esse código funciona e envia as Strings da foto para o Android, porém o sistema de retaguarda do cliente aceita qualquer tamanho de foto e várias extensões (JPG, JPEG, BMP, ICO, EMF, WMF) o que deixa a foto muito grande para o Android. Quando a String chega no Android ocorre o estouro de memória heap.

Então pensei em reduzir a imagem para depois a enviar.

Pesquisei e encontrei esse post

DIMINUIR RESOLUÇÃO DA IMAGEM


Contudo me parece que o código foi foi para se utilizar 2 componentes e abria a imagem e salvar novamente.


Não teria como fazer da maneira que eu fiz?

Recuperar a imagem do banco e já reduzi-la para envia-la.

OBS: Utilizo Delhi XE5 + Firebird 1.5 (Banco do Cliente) + Campo da foto é Blob.
Willian Amor

Willian Amor

Curtidas 0
POSTAR