PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 25 → Como baixar uma imagem da internet no Windev Mobile ?
Como baixar uma imagem da internet no Windev Mobile ?
Started by Boller, May, 05 2025 1:10 PM - 5 replies
Registered member
3,963 messages
Posted on May, 05 2025 - 1:10 PM
Procedure DownloadImagem()

IF SB_MenuEdit = 3 THEN

sURL1 is string ANSI = EDT_Pergunta

sCaminhoImagem is string
IF InAndroidMode() OR InIOSMode() THEN
sCaminhoImagem = fDataDir() + "/" + "imagem.png"
ELSE
sCaminhoImagem = fExeDir() + "\imagem.png"
END

sCaminhoLog is string = fDataDir() + "/" + "log_download_imagem.txt"

IF HTTPRequest(sURL1) THEN

bufImagemBytes is Buffer = HTTPGetResult(httpResult)

IF Length(bufImagemBytes) > 0 THEN

IF fSaveBuffer(sCaminhoImagem, bufImagemBytes) THEN
IMG_Note = sCaminhoImagem
ELSE
Error("Erro ao salvar a imagem.")
fSaveText(sCaminhoLog, DateSys() + " " + TimeSys() +
" | ERRO: salvar imagem | " + sCaminhoImagem + CR, foAdd)
END

ELSE
Error("Imagem recebida está vazia.")
fSaveText(sCaminhoLog, DateSys() + " " + TimeSys() +
" | ERRO: imagem vazia | URL: " + sURL1 + CR, foAdd)
END

ELSE
Error("Falha na requisição da imagem.")
fSaveText(sCaminhoLog, DateSys() + " " + TimeSys() +
" | ERRO: HTTPRequest | URL: " + sURL1 + CR, foAdd)
END

END

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Registered member
3,963 messages
Posted on May, 05 2025 - 1:12 PM
Explicação do código:

Claro! Aqui está a explicação detalhada do código adaptado para Windev Mobile:



Objetivo do Código

Baixar uma imagem a partir de uma URL informada pelo usuário (no campo EDT_Pergunta) e exibi-la no controle de imagem IMG_Note. Em caso de erro, um log com data e hora é salvo no diretório de dados do app.



Bloco por bloco

1. Verifica se o botão pressionado foi o de código 3

IF SB_MenuEdit = 3 THEN

Esse IF garante que o código só será executado quando o botão com o código 3 for pressionado (você pode trocar isso por outro gatilho se quiser).



2. Define a URL e o caminho da imagem

sURL1 is string ANSI = EDT_Pergunta

Pega a URL digitada pelo usuário.

IF InAndroidMode() OR InIOSMode() THEN
sCaminhoImagem = fDataDir() + "/" + "imagem.png"
ELSE
sCaminhoImagem = fExeDir() + "\imagem.png"
END

• fDataDir() retorna a pasta onde o app pode gravar arquivos no Android/iOS.
• fExeDir() seria para Windows, então está ali por compatibilidade.
• A imagem será salva como imagem.png.



3. Define o caminho para salvar o log de erro

sCaminhoLog is string = fDataDir() + "/" + "log_download_imagem.txt"

Arquivo onde os erros são salvos com data/hora para diagnóstico posterior.



4. Faz o download da imagem

IF HTTPRequest(sURL1) THEN

Se a requisição HTTP for bem-sucedida, ele continua.

bufImagemBytes is Buffer = HTTPGetResult(httpResult)

Recupera os bytes da imagem como um Buffer.



5. Verifica se recebeu dados válidos

IF Length(bufImagemBytes) > 0 THEN

Evita salvar um arquivo vazio.



6. Salva a imagem no disco

IF fSaveBuffer(sCaminhoImagem, bufImagemBytes) THEN
IMG_Note = sCaminhoImagem
ELSE
Error("Erro ao salvar a imagem.")

• Se conseguir salvar a imagem, ela é exibida no controle IMG_Note.
• Se não, um erro é exibido e é registrado no log.



7. Tratamento de falhas

Se a imagem for vazia ou a requisição falhar, ele exibe uma mensagem e grava no arquivo de log:

fSaveText(sCaminhoLog, ..., foAdd)

O parâmetro foAdd garante que o texto será adicionado ao final do arquivo.



Resumo final
• Compatível com Android e iOS.
• Salva erros no log.
• Garante que a imagem não seja salva se estiver vazia.
• Exibe a imagem no app se tudo funcionar corretamente.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Registered member
3,963 messages
Posted on May, 05 2025 - 1:13 PM
Ótimo! Vamos estender o código para:

1. Funcionar offline com cache

2. Redimensionar a imagem antes de exibir no controle



Versão Estendida (com Cache e Redimensionamento)

IF SB_MenuEdit = 3 THEN

sURL1 is string ANSI = EDT_Pergunta

sNomeArquivoImagem is string = Replace(sURL1, "/", "_")
sNomeArquivoImagem = Replace(sNomeArquivoImagem, ":", "_") + ".png"

sCaminhoImagem is string
sCaminhoLog is string = fDataDir() + "/" + "log_download_imagem.txt"

// Define o caminho da imagem no diretório de dados
IF InAndroidMode() OR InIOSMode() THEN
sCaminhoImagem = fDataDir() + "/" + sNomeArquivoImagem
ELSE
sCaminhoImagem = fExeDir() + "\" + sNomeArquivoImagem
END

// Verifica se a imagem já está salva localmente
IF fFileExist(sCaminhoImagem) THEN
IMG_Note = sCaminhoImagem
ELSE
IF HTTPRequest(sURL1) THEN
bufImagemBytes is Buffer = HTTPGetResult(httpResult)

IF Length(bufImagemBytes) > 0 THEN
IF fSaveBuffer(sCaminhoImagem, bufImagemBytes) THEN

// Redimensiona a imagem antes de exibir
imgTmp is Image = sCaminhoImagem
imgRedimensionada is Image = dResize(imgTmp, 512, 512, dKeepRatio)

sCaminhoImagemFinal is string = fDataDir() + "/redimensionada_" + sNomeArquivoImagem
dSaveImagePNG(imgRedimensionada, sCaminhoImagemFinal)

IMG_Note = sCaminhoImagemFinal
ELSE
Error("Erro ao salvar a imagem.")
fSaveText(sCaminhoLog, DateSys() + " " + TimeSys() + " - Erro ao salvar: " + sURL1, foAdd)
END
ELSE
Info("Imagem inválida ou vazia.")
fSaveText(sCaminhoLog, DateSys() + " " + TimeSys() + " - Imagem vazia: " + sURL1, foAdd)
END
ELSE
Info("Erro ao baixar a imagem da internet.")
fSaveText(sCaminhoLog, DateSys() + " " + TimeSys() + " - Falha HTTP: " + sURL1, foAdd)
END
END

END





Novidades dessa versão:
• Cache offline: salva a imagem com nome baseado na URL e reutiliza localmente.
• Redimensionamento: usa dResize() para deixar a imagem em tamanho ideal (512x512, mantendo proporção).
• Versão redimensionada salva separadamente: com prefixo redimensionada_ para não sobrescrever o cache.
• Melhor rastreamento de erros no log.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Registered member
3,963 messages
Posted on May, 05 2025 - 1:15 PM
Perfeito! Vamos estender o código com:

3. Upload opcional da imagem para um servidor remoto

4. Botão para limpar o cache local das imagens



3. Upload da Imagem para um Servidor (ex: PHP ou API REST)

Adicione após exibir a imagem:

// Upload opcional para servidor
sURLUpload is string = "https://seudominio.com/upload.php"
IF NetConnected() THEN
HTTPCreateForm("UploadImagem")
HTTPAddFile("UploadImagem", "arquivo", sCaminhoImagemFinal)

IF HTTPSendForm("UploadImagem", sURLUpload, httpPost, "") THEN
Trace("Imagem enviada com sucesso.")
ELSE
Error("Erro ao enviar a imagem.")
END
HTTPDeleteForm("UploadImagem")
END

Importante: seu servidor precisa de um script upload.php ou endpoint que aceite multipart/form-data.



4. Botão para Limpar o Cache

Você pode criar um botão chamado BTN_LimparCache e colocar este código:

arrArquivos is array of strings = fListFile(fDataDir() + "/*.png", frNotRecursive)

FOR EACH sArquivo OF arrArquivos
fDelete(fDataDir() + "/" + sArquivo)
END

Info("Cache de imagens limpo com sucesso.")





Resumo Final dos Recursos:

Recurso Implementado
Baixa imagem por URL Sim
Salva localmente com nome único Sim
Exibe redimensionada (512x512) Sim
Funciona offline (cache) Sim
Upload da imagem para servidor Sim
Limpa cache local com botão Sim

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Registered member
3,963 messages
Posted on May, 05 2025 - 1:16 PM
Vamos agora implementar um visualizador de imagens em cache com opção de excluir individualmente. Isso é muito útil em apps mobile para gerenciamento do armazenamento local.



1. Estrutura do Projeto

Crie os seguintes controles na tela:
• BTN_AtualizarLista: botão com legenda “Atualizar Lista”
• LST_Imagens: controle ListView com modo imagem + legenda
• BTN_ExcluirSelecionada: botão com legenda “Excluir Selecionada”
• IMG_Preview: controle de imagem para pré-visualização



2. Código do botão “Atualizar Lista”

// Limpa a lista
ListDeleteAll(LST_Imagens)

arrArquivos is array of strings = fListFile(fDataDir() + "/*.png", frNotRecursive)

FOR EACH sArquivo OF arrArquivos
ListAdd(LST_Imagens, sArquivo + TAB + fDataDir() + "/" + sArquivo)
END





3. Código do evento “Seleção de item” da lista

sImagemSelecionada is string = ListSelect(LST_Imagens, lstSelectValue)
IMG_Preview = sImagemSelecionada





4. Código do botão “Excluir Selecionada”

sImagemSelecionada is string = ListSelect(LST_Imagens, lstSelectValue)

IF sImagemSelecionada <> "" THEN
IF fDelete(sImagemSelecionada) THEN
Info("Imagem excluída.")
IMG_Preview = ""
ListDelete(LST_Imagens, ListSelect(LST_Imagens))
ELSE
Error("Erro ao excluir a imagem.")
END
END





Recursos Incluídos:

Recurso Implementado
Listagem das imagens salvas localmente Sim
Pré-visualização ao tocar Sim
Exclusão individual Sim
Atualização da lista de imagens Sim

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Registered member
3,963 messages
Posted on May, 05 2025 - 1:17 PM
Perfeito! Vamos otimizar para apps mobile usando thumbnails (miniaturas) no controle ListView para economizar memória e carregar mais rápido.



Melhoria: Exibir Thumbnails no ListView

1. Alteração no ListView LST_Imagens

Configure o LST_Imagens para modo “Imagem + Texto”, com a imagem vinda por programação.

2. Nova função: gerar thumbnail

PROCEDURE GeraThumbnailImagem(sCaminhoImagem is string, nLargura is int = 120, nAltura is int = 120) : string
sThumbPath is string = fDataDir() + "/thumb_" + fExtractPath(sCaminhoImagem, fFileName)

IF NOT fFileExist(sThumbPath) THEN
IF dLoadImage(sCaminhoImagem) THEN
dResize(nLargura, nAltura, resizeHighQuality)
dSaveImageJPEG(sThumbPath, 80) // compressão de 80%
END
END

RESULT sThumbPath





3. Atualize o código do botão “Atualizar Lista” para usar thumbnails

ListDeleteAll(LST_Imagens)

arrArquivos is array of strings = fListFile(fDataDir() + "/*.png", frNotRecursive)

FOR EACH sArquivo OF arrArquivos
sCaminho is string = fDataDir() + "/" + sArquivo
sThumb is string = GeraThumbnailImagem(sCaminho)
ListAdd(LST_Imagens, sArquivo + TAB + sThumb + TAB + sCaminho)
END





4. Evento “Seleção” da lista

// A terceira coluna da lista armazena o caminho original da imagem
sCaminhoCompleto is string = ListSelect(LST_Imagens, 3)
IMG_Preview = sCaminhoCompleto





Resultado
• Carregamento mais leve: thumbnails pequenos no ListView.
• Preview em alta qualidade: imagem real no controle IMG_Preview.
• Performance otimizada para Android/iOS.



Espero que tenha gostado do exemplo!

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/