PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 25 → WX - Trabalhando com Byte Array
WX - Trabalhando com Byte Array
Started by adrianoboller, Jun., 04 2016 1:21 AM - 24 replies
Registered member
3,645 messages
Popularité : +175 (223 votes)
Posted on June, 04 2016 - 1:21 AM
Prezados,

Estarei passando um exemplo aqui para ler um arquivo pdf em uma matriz de bytes.

A linguagem WL, permite fazer a leitura de um arquivo pdf.

//LENDO UM ARQUIVO PDF E SALVANDO EM DISCO
sAuxis string

sDocumentTitleis string

MyBufferis Buffer

sDocumentTitle= fExtractPath( sAux, fFileName )

MyBuffer= fLoadText( sAux )

fSaveText("TEST.PDF", myBuffer )

//TESTE O ARQUIVO GERADO: TEST.PDF




LEITURA DE BYTE ARRAY
//EXEMPLO

MyBuffer is Buffer = fLoadBuffer("TEST.PDF")

//Agora você pode cortar buffer f.i.

slice is Buffer = MyBuffer [[1 TO 8]] // leia o primeiro 8 bytes

// OR ...se preferir um array de bytes

n is int = Length(MyBuffer)

fileArr is array of n byte

FOR i = 1 TO n

fileArr[ i ] = MyBuffer[[ i ]]

END

//A variável fileArr tem o conteúdo lido.



Como pode ser visto no código, eu salvo na variável buffer para um arquivo com extensão pdf e depois que eu posso ler esse arquivo sem erros em qualquer leitor de PDF. Posso entao usar o comando Crypt para serializar o buffer em uma grande string de caracteres, letras e números e enviar via webservice. E com UnCrypt no outro lado remonto o buffer para ter o arquivo pdf e assim conseguimos fazer algo muito parecido com o Teletransporte do filme Star Trek. kkkk...





Crypt:
http://help.windev.com/en-US/…
// Encode a string in base 64
bufBase64 isbuffer = Crypt(bufToEncode, "", compressNone + cryptNone, encodeBASE64)


Uncrypt:
http://help.windev.com/en-US/…
// Declare and initialize the variables
StringToEncrypt is string = "The number of my account in Switzerland is 74538290"
Password is string = "JamesBond007"
EncryptedString is string
DecryptedString is string
// Encrypt the message
EncryptedString = Crypt(StringToEncrypt, Password, cryptSecure)
// Send the message by email for example
...
// Decrypt the message later
DecryptedString = Uncrypt(EncryptedString, Password, cryptSecure)
Info("The encrypted message meant: " + DecryptedString)


Assim eu posso usando os comandos acima enviar o buffer (byte array) com o formato de um bloco de texto para um webservice. E ainda posso fazer com que o webservice responda de volta: Arquivo PDF inválido ou válido.

Espero que o exemplo ajude a comunidade a produzir novos exemplos e novas soluções.

Forte abraço

:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Registered member
3,645 messages
Popularité : +175 (223 votes)
Posted on March, 24 2020 - 11:33 PM
Prezados

Esse assunto é muito solicitado e vou passar umas orientações adicionais

No lado do servidor na tabela de cadastro de produtos pense em ter os seguintes campos:

IdProduto
NomeProduto
ImagemGrande binário
ImagemThumbs binário
ImagemGrandeZipada binário
ImagemThumsZipada binário

Ao gravar uma imagem de um produto
Salvar a imagem com 80% no campo ImagemGrande
Salvar essa mesma imagem redimensionando para um tamanho menor para ImagemThumbs
Zipar o buffer e salvar o binário ImagemGrandeZipada
Zipar o buffer e salvar o binário ImagemThumsZipada

Quando o Webservice requisitar o produto tem as duas imagens zipadas e salvas em 80% é reduzida para Thumbs
A requisição não terá o tempo de processamento de zipar para entregar ao celular que requisitou a informação
Ao chegar no celular pelo Webservice faz a descompactacao e salvamento da informação na tabela Hfsql Classic as duas imagens

Esse procedimento agiliza o download e garante a exibição dos dados mesmo em off-line.

Espero ter ajudado com essa sugestão

Um forte abraço a todos

--
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,645 messages
Popularité : +175 (223 votes)
Posted on April, 10 2020 - 2:26 PM
Ou use

Bufimage is buffer = dliadbuffer( « imagem.jpg »)


ImagemString is string = encode(bufimagem, base64)

Reverso

ImagemBuff us buffer = decode(bufimagem, base64)

--
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,645 messages
Popularité : +175 (223 votes)
Posted on April, 27 2020 - 8:56 PM
Boa tarde...

Nossos clientes as vezes mandam protocolos impressos e gostaria de digitalizar e gravar no HFSQL.

Qual seria o melhor método?

Gravar a imagem dentro do banco ou criar um link das imagem em uma pasta?

Alguém tem exemplo disso ?

Tudo depende do teu gosto as duas funcionam (base binária ou link ftp httprequest)

O campo binário do Hfsql é muito bom


Como eu faço:

- Crio uma tabela t001_pessoas E nela crio os campos Mas não coloco o binário nessa tabela da foto Crio outra tabela t002_pessoas_fotos

Relaciono e coloco o campo binário Isso não vai deixar lento vai funcionar ok e o tamanho do buffer da imagem vai para essa tabela

Funciona muito bem não diminui velocidade de consulta

Só vai transitar na rede a foto somente quando pedir ela

Se der um select *
não terei o buffer da foto transitando na rede sem motivo

Eu acho que é o mais lógico

Se for com link terá que fazer um http request além de um select

Será mais complexo, mas vai funcionar

Serão 4 operações e com a tabela binária, reservar o link numa variável e consultar com httprequest e depois um httpgettesult.

E um select com inner join 2 operação tem o resultado em um buffer ou em um array de string encode64 que terá que converter para buffer

Guardar no banco terá um consumo a mais de espaço, mas é bem simples e garantido :-)

Se for link se for ip e trocou para DNS ou para outro ip ou DNS daí o link ficou inútil, não vai baixar :-(

OK

--
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,645 messages
Popularité : +175 (223 votes)
Posted on April, 28 2020 - 4:46 AM
Exemplo Download

https://depot.pcsoft.fr/resource.awp…

--
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,645 messages
Popularité : +175 (223 votes)
Posted on March, 08 2021 - 4:56 PM
Procedure WSObterListaMensagens()
//Importar mensagens aluno//

NextTitle("")
HourGlass() // criando load

url is string = ""+gsUrlBackend+"/WSListarMensagens.rule?sys=EDU&alunoID="+gloAluno_id_externo+""

IF httpRequest(url) = True

gvRetornoMsg = JSONToVariant(HTTPGetResult())

IF gvRetornoMsg.status = "OK" THEN

x is int

vTotal is int = gvRetornoMsg.mensagens..Count

LOOP(vTotal)

x++

HReset(tab_mensagens)
IF HReadSeek(tab_mensagens,msg_chave_externa,gvRetornoMsg.mensagens[x].chave_externa,hIdentical) = False THEN

bufFotoMsg1 is Buffer = Decode(gvRetornoMsg.mensagens[x].img_mensagem, encodeBASE64)

imageFoto is Image = bufFotoMsg1

dSaveImageJPEG(imageFoto,fCurrentDir()+"\imagemfoto.jpg", 80) // 80% de compressao da imagem

bufFotoMsg2 is Buffer = fLoadBuffer(fCurrentDir()+"\imagemfoto.jpg") //pega o arquivo modificado o tamanho

//5000kb para 600kb mantendo a qualidade

HReset(tab_mensagens)
HReadSeek(tab_mensagens,msg_chave_externa,gvRetornoMsg.mensagens[x].chave_externa,hIdentical)

tab_mensagens.msg_chave_externa = gvRetornoMsg.mensagens[x].chave_externa
tab_mensagens.alu_chave_externa = gvRetornoMsg.mensagens[x].id_aluno
tab_mensagens.alu_instituicao_id = gvRetornoMsg.mensagens[x].id_instituicao
tab_mensagens.msg_nome_remetente = gvRetornoMsg.mensagens[x].nome_remetente
tab_mensagens.msg_assunto = gvRetornoMsg.mensagens[x].assunto
tab_mensagens.msg_conteudo = gvRetornoMsg.mensagens[x].conteudo
tab_mensagens.msg_fotografia_msg = bufFotoMsg2 //pronto
tab_mensagens.msg_resposta_sim = gvRetornoMsg.mensagens[x].resposta_sim
tab_mensagens.msg_resposta_nao = gvRetornoMsg.mensagens[x].resposta_nao
tab_mensagens.msg_resposta_talvez = gvRetornoMsg.mensagens[x].resposta_talvez
tab_mensagens.msg_dh_cadastro = gvRetornoMsg.mensagens[x].dh_cadastro

IF HAdd(tab_mensagens) = True THEN // Adiciona mensagem
//Info("Gravou com sucesso!")

ELSE

Error(ErrorInfo(), HErrorInfo())

END

// ELSE
//
// HReset(tab_mensagens)
// HReadSeek(tab_mensagens,msg_chave_externa,gvRetornoMsg.mensagens[x].chave_externa,hIdentical)
//
// bufFotoMsg is Buffer = Decode(gvRetornoMsg.mensagens[x].img_mensagem, encodeBASE64)
//
// tab_mensagens.msg_chave_externa = gvRetornoMsg.mensagens[x].chave_externa
// tab_mensagens.alu_chave_externa = gvRetornoMsg.mensagens[x].id_aluno
// tab_mensagens.alu_instituicao_id = gvRetornoMsg.mensagens[x].id_instituicao
// tab_mensagens.msg_nome_remetente = gvRetornoMsg.mensagens[x].nome_remetente
// tab_mensagens.msg_assunto = gvRetornoMsg.mensagens[x].assunto
// tab_mensagens.msg_conteudo = gvRetornoMsg.mensagens[x].conteudo
// tab_mensagens.msg_fotografia_msg = bufFotoMsg
// tab_mensagens.msg_resposta_sim = gvRetornoMsg.mensagens[x].resposta_sim
// tab_mensagens.msg_resposta_nao = gvRetornoMsg.mensagens[x].resposta_nao
// tab_mensagens.msg_resposta_talvez = gvRetornoMsg.mensagens[x].resposta_talvez
// tab_mensagens.msg_dh_cadastro = gvRetornoMsg.mensagens[x].dh_cadastro
//
// IF HModify(tab_mensagens) = True THEN // Atualiza mensagem
// //Info("Atualizado com sucesso!")
//
// ELSE
// Error(ErrorInfo(), HErrorInfo())
//
// END
//
END

END

ELSE

ToastDisplay(gFontBold() + gFont("Arial") + gFontSize(8) + ...
gPen(RGB(255,255,255)) + gvRetornoMsg.Erro, ...
toastShort, vaBottom, haCenter)

END

ELSE

//Mensagem quando não há conexão com servidor//
ToastDisplay(gFontBold() + gFont("Arial") + gFontSize(6) + ...
gPen(RGB(255,255,255)) + "Ops! Sem resposta do servidor!", ...
toastShort, vaBottom, haCenter)

END

Multitask(-1)
HourGlass(False) //Remomendo load
NextTitle("") // Titulo fim load


--
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,645 messages
Popularité : +175 (223 votes)
Posted on March, 09 2021 - 2:56 PM
Procedure RedimencionarFoto(ImgOriginal)

bufFoto is Buffer

Foto is Image = ImgOriginal

IF Length(ImgOriginal) > 0

dSaveImageJPEG(Foto,fCurrentDir()+"\imagemfoto.jpg", IMG_PADRAO_AJUSTADA) // 80% de compressao

bufFoto = fLoadBuffer(fCurrentDir()+"\imagemfoto.jpg")

ELSE

fDelete(fCurrentDir()+"\imagemfoto.jpg",frReadOnly)

END

RETURN(bufFoto)


--
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,645 messages
Popularité : +175 (223 votes)
Posted on March, 09 2021 - 3:12 PM
Prezados,

Caso nao tenha foto, coloca uma foto na posicao negativa e atribui ela e descobre pelo tamanho do buffer se tem ou nao a foto num campo binario usando LENGTH > 0

Procedure MyWindow(gMensagem_id)

QRY_MENSAGEM_SELECIONADA_ID.Parammsg_id = gMensagem_id

IF HExecuteQuery(QRY_MENSAGEM_SELECIONADA_ID) = True THEN

FOR EACH QRY_MENSAGEM_SELECIONADA_ID

// STC_DIA_MSG = QRY_MENSAGEM_SELECIONADA_ID.msg_dia_mensagem

IF Length (QRY_MENSAGEM_SELECIONADA_ID.msg_fotografia_msg) > 0 THEN

IMG_foto_mensagem = QRY_MENSAGEM_SELECIONADA_ID.msg_fotografia_msg

ELSE

IMG_foto_mensagem = IMG_sem_foto // sem foto

END

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,645 messages
Popularité : +175 (223 votes)
Posted on March, 09 2021 - 3:16 PM
Lembre-se

1 - passar parametros a query para filtrar

2 - HExecuteQuery OU HExecuteSQLQuery dispara o camando

IF True = para saber se deu certo o comando

exemplo

IF HExecuteQuery(Qry_query) = True

ELSE

END

3 - para ler o retorno tem que fazer um for each na query

IF HExecuteQuery(Qry_query) = True

for each Qry_query
retorno = Qry_query.campo
END

ELSE
Info("Erro")
END

4 - para atualizar o looper OU table só depois disso tudo

TableDisplay(table_grid, tatinit)

se for looper

LooperDisplay(loop_grid, tatinit)


--
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,645 messages
Popularité : +175 (223 votes)
Posted on March, 16 2021 - 10:57 PM




--
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,645 messages
Popularité : +175 (223 votes)
Posted on March, 16 2021 - 11:00 PM
Passos:

1 - criar var tipo imagem
2 - ler a imagem que esta no banco com dloadbuffer e armazenar na imagem de memoria
3 - dresize dimensionar o tamanho 800x600
4 - fsavebuffer salvar o que resultou no dresize em disco
5 - dsaveimagejpg salvar em 80%
6 - ler novamente o arquivo e converter ele de volta para imagem de memoria e buffer

--
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,645 messages
Popularité : +175 (223 votes)
Posted on July, 26 2021 - 9:47 PM
Fica do Ronei

SELECT

a320.numero_foto,
a320.descricao_foto,Encode(a320.foto,'base64') AS foto

FROM cad_mercad_ficha_tecnica_fotos a320

WHERE

a320.codigo_mercadoria=1




sSQLSentenca is string
dsQRYSelect is Data Source
bRetornoSQL is boolean
nRegistro is int = 0
nCodigoMercadoria is int = ExtractString(ParParametros,1,["|"])

sSQLSentenca = "SELECT a320.numero_foto,a320.descricao_foto,encode(a320.foto,'base64') AS foto FROM cad_mercad_ficha_tecnica_fotos a320 WHERE a320.codigo_mercadoria=" + nCodigoMercadoria

bRetornoSQL = SQLExec(sSQLSentenca, dsQRYSelect)
IF bRetornoSQL = False THEN

SQLInfo(dsQRYSelect)
gsXML += "<Error>Erro Select BD - " + SQL.Error + " - " + SQL.MesError + "</Error>"

ELSE

gsXML += "<Dados>"
WHILE SQLFetch(dsQRYSelect) = 0
nRegistro++
gsXML += "<Registro" + nRegistro + ">"
Preenche_TAG("NumeroFoto",SQLGetCol(dsQRYSelect,1))
Preenche_TAG("DescricaoFoto",SQLGetCol(dsQRYSelect,2))
Preenche_TAG("ImagemFoto",SQLGetCol(dsQRYSelect,3))
gsXML += "</Registro" + nRegistro + ">"
END
gsXML += "</Dados>"
gsXML += "<TotalRegistros>" + nRegistro + "</TotalRegistros>"

END
SQLClose(dsQRYSelect)


--
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,645 messages
Popularité : +175 (223 votes)
Posted on September, 22 2021 - 11:16 PM
O Sr Leomar fez vários testes com os mesmos arquivos e tamanhos. RESTSend +/- 20% mais rápido que HTTPSend



Para guardar

myimage is Buffer = fLoadBuffer(IMG_BANNER)
bufBase64 is Buffer = Encrypt(myimage,"senha",cryptSecure,encodeBASE64)



Para Abrir

IMG_NoName1 = Decrypt(test.image,"senha",cryptSecure,encodeBASE64)


By Diego de Ponta Pora

--
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,645 messages
Popularité : +175 (223 votes)
Posted on March, 17 2022 - 5:22 PM
Saber o tamanho de uma imagem ou se existe imagem no controle

imgx is Image = dLoadImage( IMG_NoName1)

IF imgx..BitPerPixel > 0 THEN

Info("tem imagem")

ELSE

Info("vazio")
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,645 messages
Popularité : +175 (223 votes)
Posted on March, 31 2022 - 5:43 AM
BAIXANDO DADOS DE PRODUTOS DE UM WEBSERVICE SOAP E FAZENDO DOWNLOAD DAS IMAGENS DE UMA URL

//EXECUTANDO O WEBSERVICE E PEGANDO O BLOCO CSV E CHAMANDO A PROC QUE VAI INTERPRETAR O CSV

Resultado is string = ws_sel_prodsite_app()

InterpretaPlotaResulta(Resultado)

------------------------------------------------------------------------------------


PROCEDURE InterpretaBlocoCsv(Resultado)

HourGlass(True)
L is int = 0
X is int = 1
Linha is string
QtdLinhas is int = StringCount(Resultado,"§",IgnoreCase)

HDeleteAll(view_prodsiteapp)

LOOP(QtdLinhas)

L++

Linha = ExtractString(Resultado,L,"§",FromBeginning)

TestaCODWEB is string = NoSpace(ExtractString(Linha,2,";",FromBeginning))

HReset(view_prodsiteapp) //a1 excel poneiro

IF HReadSeek(view_prodsiteapp, CODWEB, TestaCODWEB, hIdentical) = False //nao achou

view_prodsiteapp.NOMEWEB = ExtractString(Linha,1,";",FromBeginning)
view_prodsiteapp.CODWEB = ExtractString(Linha,2,";",FromBeginning)
view_prodsiteapp.NOMMARC = ExtractString(Linha,3,";",FromBeginning)
view_prodsiteapp.REFERENCIA = ExtractString(Linha,4,";",FromBeginning)
view_prodsiteapp.PRECO_A = ExtractString(Linha,5,";",FromBeginning)
view_prodsiteapp.PRECO_B = ExtractString(Linha,6,";",FromBeginning)
view_prodsiteapp.DESCUENTO = ExtractString(Linha,7,";",FromBeginning)
view_prodsiteapp.STOCK = ExtractString(Linha,8,";",FromBeginning)
view_prodsiteapp.FOTOS_PATH = "https://www.fastrax.com.py/documentos/"+NoSpace(view_prodsiteapp.CODWEB)+".png"

IF HAdd(view_prodsiteapp) = True

Thread_BuscaGravaFoto(view_prodsiteapp.CODWEB, view_prodsiteapp.FOTOS_PATH )

LooperAdd(LOOP_Compra_Rapida,view_prodsiteapp.CODWEB +TAB+ view_prodsiteapp.NOMEWEB +TAB+ view_prodsiteapp.NOMMARC +TAB+ view_prodsiteapp.REFERENCIA +TAB+ view_prodsiteapp.PRECO_A +TAB+ view_prodsiteapp.PRECO_B +TAB+ view_prodsiteapp.DESCUENTO +TAB+ view_prodsiteapp.STOCK)

END

END

END

LooperDisplay(LOOP_Compra_Rapida,taInit) //refresh

HourGlass(False)

------------------------------------------------------------------------

PROCEDURE Thread_BuscaGravaFoto(codwebx, pathfoto)

NaoExiste is boolean = False

HReset(view_prodsiteapp_fotos)
IF HReadSeek(view_prodsiteapp_fotos,CODWEB,codwebx,hIdentical)= False THEN
NaoExiste = True
END

IF HNbRec(view_prodsiteapp) > 0 and NaoExiste = True

HTTPRequest(pathfoto) //download

imagemProduto is Image = HTTPGetResult()

view_prodsiteapp_fotos.CODWEB = codwebx
view_prodsiteapp_fotos.FOTOBIN = imagemProduto
view_prodsiteapp_fotos.FOTOTHUMB = dResize(imagemProduto,60,30,drStretched)

IF imagemProduto..BitPerPixel > 0 THEN

//Info("tem imagem")
HAdd(view_prodsiteapp_fotos)

ELSE

//Info("vazio")

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,645 messages
Popularité : +175 (223 votes)
Posted on April, 26 2022 - 9:30 PM
bufImagem is Buffer

dSaveImageJPEG(IMG_resultado, fCurrentDir() + fSep() + "Image.JPEG")

bufImagem = fLoadBuffer(fCurrentDir() + fSep() + "Image.JPEG")

ImagemB64 is Variant = Encode(bufImagem, encodeBASE64)

enviar_foto_recortada(id_pessoa,ImagemB64)

Close()

--
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,645 messages
Popularité : +175 (223 votes)
Posted on May, 05 2022 - 6:01 PM
ProcedureSelecionaImagem(Janela,ControleImagem)

bufImagebufferisBuffer

sFileis string=fSelect("c:\","Selecione uma Foto...","Todos os arquivos (*.*)"+TAB+"*.*"+CR+"PNG"+TAB+"*.PNG"+CR+"JPEG"+TAB+"*.JPEG"+CR+"JPG"+TAB+"*.JPG","*.*")

IFfFileExist(sFile) =True

bufImagebuffer=fLoadBuffer(sFile)

sControlTelaImgis string=Janela+"."+ControleImagem

{sControlTelaImg,indControl} =bufImagebuffer

dResize({sControlTelaImg,indControl},{sControlTelaImg,indControl}..Width,{sControlTelaImg,indControl}..Height,drHomotheticCentered)

bufImagebuffer= {sControlTelaImg,indControl}

ELSE

Info("Nenhum arquivo selecionado!")

END

RESULTbufImagebuffer
CASE ERROR:

--
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,645 messages
Popularité : +175 (223 votes)
Posted on May, 05 2022 - 6:02 PM
ProcedureSaveJpg(Imagemis Image)

ratioXis real=130/Imagem..Width
ratioYis real=130/Imagem..Height
IFratioY<ratioXTHEN
dResize(Imagem,130,RoundUp(Imagem..Height*ratioX))
ELSE
dResize(Imagem,RoundUp(Imagem..Width*ratioY),130)
END
dSaveImageJPEG(Imagem,"foto.jpg",100)

RESULT(Imagem)

--
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,645 messages
Popularité : +175 (223 votes)
Posted on June, 03 2022 - 8:34 PM
Comando para setar resolução da câmera em 1080x1080 (Para fotos quadradas)
Testando em WX26

VideoParameter(vipPhotoResolution, "1080 1080")


Rotina para enviar imagem para WS Rest (desenvolvido em PHP)

req is httpRequest
sURL = URLEncode(sURL)
req.URL = sURL
req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.42000)"
req.Method = httpPost
imagem is Variant
imagem = Encode(dLoadImage(IMG_FotoPac,imgDefault),encodeBASE64)
req.Content = imagem

HTTPTimeOut(60s)

cMyResponse is httpResponse = HTTPSend(req)

IF ErrorOccurred THEN
sRetorno = ErrorInfo(errFullDetails)
Error(ErrorInfo(errFullDetails))
ELSE
sRetorno = cMyResponse..Content
ToastDisplay(sRetorno)
Close()
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,645 messages
Popularité : +175 (223 votes)
Posted on June, 08 2022 - 8:25 PM
Prezados,

Send Imagem by HTTPCreateForm sem serializar e sem fazer uso de encode base 64

Retificando o exemplo de imagem
ficou assim usando HTTPCreateForm muito mais simples:

lIdForm is string = "form-data"
HTTPTimeOut(60s)
HTTPCreateForm(lIdForm)
HTTPAddFile(lIdForm, "file", gsLastCapturePath)
IF HTTPSendForm(lIdForm, sURL, httpPost, "AGENT") THEN
sRetorno is JSON = HTTPGetResult()
END

Retorna isso aqui:

{
"eyes":
{
"ratio":1.060935286195,
"response":"olho esquerdo > olho direito por 0.06%"
},
"eyebrows":
{
"ratio":1.060935286195,
"response":"olho esquerdo > olho direito por 0.06%",
"muscles":
[

],
"points":
[

]
},
"left_eyebrow":
[

],
"right_eyebrow":
{
"muscles":
[
[
"Pr\u00f3cero",
8,
5
],
[
"Corrugador (e)",
336,
5
],
[
"Corrugador (e)",
468,
5
]
],
"points":
[
[
8,
5
],
[
336,
5
],
[
468,
5
]
]
},
"horizontal_proportion":
[
"61",
"89",
"100",
"84",
"54"
],
"vertical_proportion":
{
"muscles":
[

],
"firstThird":
[
376.2605480249,
1
],
"secondThird":
[
476.3402145526,
1.265985012388
],
"thirdThird":
[
654.4043092768,
1.739231797519
]
},
"mouth":
{
"ratio":0.006996088402819,
"response":"boca esquerdo < boca direito por 0.01%"
},
"width_height":
{
"ratio":0.9830342433159
},
"nose_width":
{
"ratio":0.8700248030915
},
"lips_proportion":
[
59.07622195097,
95.08417323614,
1.609516825823
],
"mouth_width_proportion":
[
390.1550973651,
888.6894845783,
401.280450558,
319.189598828
],
"thirds_middle_horizontal_proportion":
[
978.8176541113,
1046.883470115,
1033.853471242
],
"id":"uO3y04xfERN7lHludC8Q",
"images":"I9Yd6tuAs0C9iC0IA7RK.jpg,horizontal_proportion_0.png,nose_0.png,thirds_middle_0.png,annotated_image0.png,left_eyebrow_0.jpg,nose_symmetry_0.png,eyebrows_0.jpg,lips_proportion_0.png,proportion_0.png, eyes_0.png,mouth_proportion_0.png"
}

MUITO OBRIGADO AO FABIANO QUE PASSOU GENTILMENTE ESSE EXEMPLO PARA A COMUNIDADE!

--
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,645 messages
Popularité : +175 (223 votes)
Posted on March, 23 2023 - 8:00 PM
//SALVANDO IMAGEM NO BANCO DE DADOS





path_imagem is string = fCurrentDir()+fSep()+"imagem.jpg"

dSaveImageJPEG(IMG_foto,path_imagem,100) /// 100% DA QUALIDADE 5000KB +-

IF fFileExist(path_imagem) = True THEN
Info("A Imagem "+path_imagem+" Existe no disco")
ELSE
Info("A Imagem "+path_imagem+" nao existe no disco")
RETURN
END

T001_FOTOS.T001_DATA_HORA = DateSys() + TimeSys()

T001_FOTOS.T001_FOTO = fLoadBuffer(path_imagem)

IF HAdd(T001_FOTOS) = True THEN
Info("GRAVOU FOTO NO BANCO")
ELSE
Error(ErrorInfo())
END




path_imagem is string = fCurrentDir()+fSep()+"imagem.jpg"

dSaveImageJPEG(IMG_foto,path_imagem,80) /// 80% DIMINUI DE 5000KB PARA 500KB MAS NAO PERDE QUALIDADE A OLHO NU.

IF fFileExist(path_imagem) = True THEN
Info("A Imagem "+path_imagem+" Existe no disco")
ELSE
Info("A Imagem "+path_imagem+" nao existe no disco")
RETURN
END

T001_FOTOS.T001_DATA_HORA = DateSys() + TimeSys()

T001_FOTOS.T001_FOTO = fLoadBuffer(path_imagem)

IF HAdd(T001_FOTOS) = True THEN
Info("GRAVOU FOTO NO BANCO")
ELSE
Error(ErrorInfo())
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,645 messages
Popularité : +175 (223 votes)
Posted on March, 23 2023 - 9:02 PM
TIRAR FOTO, REDUZIR O TAMANHO E SALVAR NO BANCO
// Résumé : Enregistre une photo
//
PROCEDURE PhotoEnregistre()

path_imagem is string = fCurrentDir()+fSep()+"IMAGEM.JPG" // ONDE VAI SALVAR A IMAGEM

//VideoParameter(vipPhotoResolution,"1080 1080")

VideoCapture(CAM_Appareil,path_imagem,viPictureCapture) // TIROU A FOTO

IMAGEM is Image // IMAGEM DE TRABALHO PARA REDIMENSIONAR O BUFFER EM OUTRO TAMANHO

IMAGEM = fLoadBuffer(path_imagem)

IF fFileExist(path_imagem) = True THEN //DEU CERTO
Info("A Imagem "+path_imagem+" Existe no disco")
dResize(IMAGEM,320,480,drStretched) //RESIZE DA IMAGEM
dSaveImageJPEG(IMAGEM,path_imagem,80) //80%
ELSE
Info("A Imagem "+path_imagem+" nao existe no disco") //DEU ERRADO
RETURN
END

T001_FOTOS.T001_DATA_HORA = DateSys() + TimeSys()

T001_FOTOS.T001_FOTO = fLoadBuffer(path_imagem) //BUFFER MODIFICADO E SALVO NO BINARIO

IF HAdd(T001_FOTOS)=True THEN
ShellExecute(path_imagem) //GRAVOU NO BANCO E ABRIU A IMAGEM
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,645 messages
Popularité : +175 (223 votes)
Posted on September, 08 2023 - 6:04 PM
Compactar a imagem e daí serializar

Reduzir width e heigth com dResize

DsaveimageJpg por 80%

E daí enviar enviar encodada

Para enviar
ImagemEncodada is string = encode(bufferImagem, base64)

Pra voltar a ser imagem usa
Buffimagem is variant = Decode(ImagemEncodada, base64)

--
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,645 messages
Popularité : +175 (223 votes)
Posted on October, 06 2023 - 7:00 PM
Para colocar o conteúdo em um buffer e depois converter em texto para transmitir via Webservice:

ImagemBuf is buffer = fLoadBuffer(pathimagem)

Depois converter o buffer em texto

ImagemBase64 is string = Encode (ImagemBuf, base64)

Estando em formato de texto só enviar normal como qualquer outro campo do banco de dados.

Muito simples, e o inverso

ImagemBuffer is buffer = decode(imagemBase64, base64)

Img_foto = ImagemBuffer

DsaveimageJpg(Img_foto, fcurrentdir()+fsep()+”foto.jpg”, 80)


Mais detalhes:

https://forum.pcsoft.fr/fr-FR/pcsoft.br.windev/1268-trabalhando-com-byte-array-3704/read.awp…

--
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,645 messages
Popularité : +175 (223 votes)
Posted on October, 19 2023 - 4:16 PM
Buenos dias

Segue algumas dicas de como trabslhar com arquivos binários.

Em resumo

1-qualquer arquivo (doc, xls, pdf, png , jpg, bmp, ico, zip, rar, certificado digital, e outros…) é igualado a um buffer ou um variant.



2-para ler um arquivo em disco e trazer o buffer dele para var você precisa do path caminho absoluto onde está ele. Exemplo: c:\meuErp\fotos\clientes\jonilton.jpg

Então

MyBuffer is Buffer = fLoadBuffer("c:\meuErp\fotos\clientes\jonilton.jpg")

Ou

MyVariant is Variant = fLoadBuffer("c:\meuErp\fotos\clientes\jonilton.jpg")



3-Apos ter o buffer de qualquer arquivo você pode fazer modificações dele.



4-Posso antes de salvar em texto modificar o tamanho, rotação, conteúdo

MyImagem is imagem = myBuffer

//redimensionar o tamanho
MyNewImagem is imagem
MyNewImagem = dResize(MyImagem, MyImagem..width/2, MyImagem..heigth/2)
//metade do tamanho

//rotacionar 90 graus
MyNewImagem=dRotate(MyNewImagem,90)



5-se for para converter para texto

ImagemString is string = encode(myBuffer, base64)

Ou

ImagemString is string = encode(myVariant, base64)



6-Se pegar o Buffer e guardar no tipo de campo binário, pode apontar diretamente para um controle de tela tipo:
A) control de imagem para os jpg, png, bmp, ico, svg, …
B) control WordTT para os doc e docx
C) control Planilha para os xls e xlsx
D) comtrol pdf para os pdf
E) outros para o Edt multiline e Edt multiline RTF

Ex

Img_FotoCliente = MyBuffer

t001_clientes.Nome = “Jonilton”
t001_clientes.fotoBinaria = MyBuffer
Hadd(t001_clientes)



7-Para salvar com menos dpi uma imagem então usa o comando DsaveimageJpg:

DsaveimageJpg(Img_fotocliente, fcurrentdir()+fsep()+”foto.jpg”, 80)

Deve ser antes de converter a imagem do disco para buffer



8-Para colocar o conteúdo em um buffer e depois converter em texto para transmitir via Webservice:

ImagemBuf is buffer = fLoadBuffer(pathimagem)

Depois converter o buffer em texto

ImagemBase64 is string = Encode (ImagemBuf, base64)

Estando em formato de texto só enviar normal como qualquer outro campo do banco de dados.

Muito simples, e o inverso

ImagemBuffer is buffer = decode(imagemBase64, base64)

Img_foto = ImagemBuffer

DsaveimageJpg(Img_foto, fcurrentdir()+fsep()+”foto.jpg”, 80)



9-o Encode converte buffer com espaços e carácteres e códigos de máquina e carácteres especiais em um array de string assim:

ImagemTexto is string = “gubibihuvyuvibibibuvygigyctfdtxrxezrzaraduewyrufiibonnpnk ivhcdyfugibihhivucuvugigufubihuvyxtcyvubibboivudyxy…”

Assim pode transmitir como fosse qualquer texto pelo Webservice soap ou rest !!!



10-Converter uma imagem em Thumbs

PROCEDURE PhotoThumbs()

path_imagem is string=fCurrentDir()+fSep()+"IMAGEM.JPG"//ONDE VAI SALVAR A IMAGEM

//VideoParameter(vipPhotoResolution,"1080 1080")

VideoCapture(CAM_Appareil,path_imagem,viPictureCapture)//TIROU A FOTO

IMAGEM is Image//IMAGEM DE TRABALHO PARA REDIMENSIONAR O BUFFER EM OUTRO TAMANHO

IMAGEM=fLoadBuffer(path_imagem)

IF fFileExist(path_imagem) =TrueTHEN//DEU CERTO
Info("A Imagem "+path_imagem+" Existe no disco")
dResize(IMAGEM,320,480,drStretched)//RESIZE DA IMAGEM
dSaveImageJPEG(IMAGEM,path_imagem,80)//80%
ELSE
Info("A Imagem "+path_imagem+" nao existe no disco")//DEU ERRADO
RETURN
END

T001_FOTOS.T001_DATA_HORA=DateSys() +TimeSys()

T001_FOTOS.T001_FOTO=fLoadBuffer(path_imagem)//BUFFER MODIFICADO E SALVO NO BINARIO

IF HAdd(T001_FOTOS)=TrueTHEN
ShellExecute(path_imagem)//GRAVOU NO BANCO E ABRIU A IMAGEM
END



Um detalhe importante sobre o DsaveimageJpg

Salvar com 80% uma imagem de 5000kb vira 500kb e permanece a olho nu igual

dSaveImageJPEG(IMAGEM,path_imagem,80)//80%

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