|
PROFESSIONAL NEWSGROUPS WINDEV, WEBDEV 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/ |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|