Fórum Reduzir imagem pelo Delphi #531361
11/09/2015
0
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.
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.
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
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)