Página 2 de 2

hb_MemoRead() lendo arquivo de imagem (jpg, png)

Enviado: 31 Out 2023 23:46
por rochinha
Amiguinhos,

Vou deixar aqui duas funções que usava para pega imagens e salvar em campos memo de DBFs.

Código: Selecionar todos

static function SalvaImagem( _imagem_ )
   RETURN str2hex( memoread( _imagem_ ) )

static function RecuperaImagem( _campo_, _imagem_ )
   RETURN memowrit( _imagem_, hex2str( _campo_ ) )
Use as funções str2hex()/hex2str() compativeis com seu ambiente.

hb_MemoRead() lendo arquivo de imagem (jpg, png)

Enviado: 01 Nov 2023 09:17
por clodoaldomonteiro
rochinha escreveu:Amiguinhos,

Vou deixar aqui duas funções que usava para pega imagens e salvar em campos memo de DBFs.

Código: Selecionar todos

static function SalvaImagem( _imagem_ )
   RETURN str2hex( memoread( _imagem_ ) )

static function RecuperaImagem( _campo_, _imagem_ )
   RETURN memowrit( _imagem_, hex2str( _campo_ ) )
Use as funções str2hex()/hex2str() compativeis com seu ambiente.
Bom dia, Rochinha.

Usei o seu código para fazer os testes abaixo, para ler um arquivo .jpg, armazena o resultado numa variável, pra depois criar outro arquivo com o conteúdo desta variável, depois o novo arquivo foi visualizado normalmente como uma imagem.
E acho que depois de ler o arquivo, pode-se fazer o q for necessário com com o conteúdo dele que lá na ponta, será visto como uma imagem válida.

Código: Selecionar todos

//Compilado em: xHarbour 1.2.3
Function Main()

   mOrigem := 'C:\SimplesInfo\Scp21H\brasao.jpg'
   mImagemHex := LerImagemToHex( mOrigem )

   //Aqui pode-se fazer o que for necessário com a variável
   
   mDestino := 'C:\SimplesInfo\Scp21H\brasaoNovo.jpg'
   If GravaImagemToStr( mImagemHex, mDestino )
      ? 'Arquivo duplicado.'
   Else
      ? 'Falha no arquivo'
   Endif

   Return Nil
   
Function LerImagemToHex( cPathArquivo )
   RETURN StrTohex( MemoRead( cPathArquivo ) )

Function GravaImagemToStr( cTextoHex, cPathArquivo )
   RETURN MemoWrit( cPathArquivo, HexTostr( cTextoHex ) )
Abraços.

hb_MemoRead() lendo arquivo de imagem (jpg, png)

Enviado: 01 Nov 2023 09:25
por JoséQuintas
Em hexadecimal dobra o tamanho, em base64 não.

hb_MemoRead() lendo arquivo de imagem (jpg, png)

Enviado: 01 Nov 2023 10:25
por clodoaldomonteiro
JoséQuintas escreveu:Em hexadecimal dobra o tamanho, em base64 não.
Mas o erro que Nilton falou, é quando a API recebe no payload os valores e processa o referente a imagem .jpg, daí teríamos que ter um ambiente de teste, pra ver o que está chegando lá, via Request, pois só lendo via memoRead() e reescrevendo com MemoWrit() dá certo.

hb_MemoRead() lendo arquivo de imagem (jpg, png)

Enviado: 01 Nov 2023 10:52
por rochinha
Amiguinhos,
Em hexadecimal dobra o tamanho, em base64 não.
Interessante, codifica para salvar ou enviar e decodifica para recuperar.

Mas creio que a transformação em hexa seria mais uma tradução para forma como a maquina iria entender, então a imagem ainda está pura.

Já cheguei a testar a simples renomear de um .JPG para .TXT, carregar este .TXT, salvar, recuperar e renomear de volta e seu conteúdo continuar intacto.

Os envio por POST permitiriam o envio da imagem no corpo do mesmo desde que configurados os content-blablabla

Exemplo do conteúdo de uma imagem codificado em hexadecimal ou base64:

Código: Selecionar todos

cMinhaImagem := "ÿØÿà�JFIF��`�`��ÿî�Adobe�d����ÿá]Exif��MM�*����2�������b;�������vGF�������GI�����?������"
Configuração do POST:

Código: Selecionar todos

...
content-disposition: form-data; name="arquivo1"; filename="minha-foto.jpg"
Content-Type: image/jpeg
Content-Transfer-Encoding: binary ÿØÿà�JFIF��`�`��ÿî�Adobe�d����ÿá]Exif��MM�*����2�������b;�������vGF�������GI�����?������
...

hb_MemoRead() lendo arquivo de imagem (jpg, png)

Enviado: 01 Nov 2023 11:52
por rochinha
Amiguinhos,

Deixo aqui mais uma função de suporte:

Código: Selecionar todos

Function hbHardCR( oque )
	return CharRem( chr(13), CharRem( chr(10), oque ) )
Sei que está redundante.

Ocorre que ao usá-la ela alivia problemas com conteúdos gerados ou lidos pela dupla MemoRead()/MemoWrit().

Creio que hb_MemoRead() ou hb_MemoWrit() tenha se livrado deste problema, mas limpeza nunca é demais.

hb_MemoRead() lendo arquivo de imagem (jpg, png)

Enviado: 01 Nov 2023 17:45
por NiltonGM
JoséQuintas escreveu:t
Oi Sé, realmente o CTE 4.00 é SINCRONO, não recebe mais ctes em lote e nem tem fila de processamento. Estou usando a API da Nuvem Fiscal, da uma olhada na documentação e veja o json que a nuvem fiscal espera receber, quem sabe você veja algo diferente, eu não notei nenhum campo novo.

https://dev.nuvemfiscal.com.br/docs/api ... /EmitirCte

hb_MemoRead() lendo arquivo de imagem (jpg, png)

Enviado: 01 Nov 2023 17:50
por NiltonGM
clodoaldomonteiro escreveu:o pay
Clodoaldo, você pode usar o ambiente de teste sandbox da nuvem Fiscal, você precisa se cadastrar, obter as chaves, obter o token de acesso com o escopo "cte, mdfe, empresa, cep, ..." e testar.
O uso da API tem um plano free muito generoso (1000 DFe's no modo produção e 100 dfes modo teste).

https://dev.nuvemfiscal.com.br/docs/api

hb_MemoRead() lendo arquivo de imagem (jpg, png)

Enviado: 01 Nov 2023 18:11
por NiltonGM
Agradeço aos demais com suas funções para lidar com imagem local, mas como tinha dito anteriormente, estou lidando com comunicação através de uma API, não é local. O problema deve estar na forma como envio a imagem pela função win_oleCreateObject("MSXML2.ServerXMLHTTP.6.0"), tento fazer exatamente como no Insomia ou Postman, pois neles funciona sem problemas, tem algum macete que não estou sabendo ao usar a MSXML2.ServerXMLHTTP.6.0, falta configurar algum parâmetro antes de enviar.
Headers:
"Authorizaton": Bearer token...
"Content-type: "image/jpeg"

Send Body: (arquivo binário da imagem jpg)
connection:WaitForResponse(5000)

Me ocorreu uma duvida agora, será que os 5000 mls é muito pouco para aguardar o envio da imagem? Assim que der vou testar com um valor bem maior, pode ser aí que a imagem é truncada antes de enviar porque não estou aguardando tempo suficiente...

Testei com 70.000 mls de espera, não funcionou não. É outra coisa...

hb_MemoRead() lendo arquivo de imagem (jpg, png)

Enviado: 01 Nov 2023 20:12
por rochinha
Amiguinhos,

Vou deixar mais uns pitacos:

Código: Selecionar todos

    body := hbMemoRead( "c:\imagem.jpeg" )

    // Forma resumida
    connection := win_oleCreateObject("MSXML2.ServerXMLHTTP.6.0")
    connection:Open("PUT", "https://api.sandbox.nuvemfiscal.com.br/empresas/57....000115/logotipo", false)
    connection:SetRequestHeader("Authorization", "Bearer " + token)
    connection:SetRequestHeader("Content-Type", "image/jpeg")   // Request Body Schema, isto muda conforme a extensão da imagem (.png ou .jpg)
    ...
    connection:SetRequestHeader("Content-Length", len( body ) )
    ...
    connection:Send(body)    // a var body contém o binário da imagem
    connection:WaitForResponse(5000)
    ...
Ou assim:

Código: Selecionar todos

    body := hbMemoRead( "c:\imagem.jpeg" )

    // Forma resumida
    connection := win_oleCreateObject("MSXML2.ServerXMLHTTP.6.0")
    connection:Open("PUT", "https://api.sandbox.nuvemfiscal.com.br/empresas/57....000115/logotipo", false)
    connection:SetRequestHeader("Authorization", "Bearer " + token)
    connection:SetRequestHeader("Content-Type", "image/jpeg")   // Request Body Schema, isto muda conforme a extensão da imagem (.png ou .jpg)
    ...
    connection:SetRequestHeader("Content-Length", len( body ) )
    connection:SetRequestHeader("Content-disposition: form-data; name="arquivo1""; filename="minha-foto.jpg"
    connection:SetRequestHeader("Content-Transfer-Encoding: binary "+body )
    ...
    connection:Send() // a var body contém o binário da imagem ira no corpo do Request
    connection:WaitForResponse(5000)
    ...

hb_MemoRead() lendo arquivo de imagem (jpg, png)

Enviado: 03 Nov 2023 18:20
por JoséQuintas
rochinha escreveu:Mas creio que a transformação em hexa seria mais uma tradução para forma como a maquina iria entender, então a imagem ainda está pura.
ASCII tem 255 caracteres, HEXADECIMAL é base16, precisa duas letras pra representar 255.
Não tem nada a ver com máquina, hexadecimal são 16 caracteres, de 0 a 9 e mais algumas letras.
00 é o Ascii 0, FF é o Ascii 255
Uma letra pra duas letras... o dobro do tamanho.

Já base 64, com 64 letras, a capacidade aumenta, mas aí já entram bits e não letra a letra.
Não é pra traduzir pra linguagem de máquina, é pra usar apenas caracteres isentos de interferência.
Lembra disto: 0D 0A.... representam Chr(13) e Chr(10) em hexadecimal, muito comum em certos manuais
Diria que é como dividir os 8 bits em dois blocos de 4 bits, tem até editor de EXE que trabalha em hexadecimal.
Isso é pra HUMANO enxergar, e não pra máquina.

hb_MemoRead() lendo arquivo de imagem (jpg, png)

Enviado: 03 Nov 2023 18:28
por JoséQuintas
NiltonGM escreveu:Oi Sé, realmente o CTE 4.00 é SINCRONO, não recebe mais ctes em lote e nem tem fila de processamento. Estou usando a API da Nuvem Fiscal, da uma olhada na documentação e veja o json que a nuvem fiscal espera receber, quem sabe você veja algo diferente, eu não notei nenhum campo novo.
https://dev.nuvemfiscal.com.br/docs/api ... /EmitirCte
Nada a ver com o que perguntei, mas deixa pra lá

hb_MemoRead() lendo arquivo de imagem (jpg, png)

Enviado: 07 Nov 2023 21:38
por NiltonGM
rochinha escreveu:Amiguinhos,

Vou deixar mais uns pitacos:

Código: Selecionar todos

    body := hbMemoRead( "c:\imagem.jpeg" )

    // Forma resumida
    connection := win_oleCreateObject("MSXML2.ServerXMLHTTP.6.0")
    connection:Open("PUT", "https://api.sandbox.nuvemfiscal.com.br/empresas/57....000115/logotipo", false)
    connection:SetRequestHeader("Authorization", "Bearer " + token)
    connection:SetRequestHeader("Content-Type", "image/jpeg")   // Request Body Schema, isto muda conforme a extensão da imagem (.png ou .jpg)
    ...
    connection:SetRequestHeader("Content-Length", len( body ) )
    ...
    connection:Send(body)    // a var body contém o binário da imagem
    connection:WaitForResponse(5000)
    ...
Ou assim:

Código: Selecionar todos

    body := hbMemoRead( "c:\imagem.jpeg" )

    // Forma resumida
    connection := win_oleCreateObject("MSXML2.ServerXMLHTTP.6.0")
    connection:Open("PUT", "https://api.sandbox.nuvemfiscal.com.br/empresas/57....000115/logotipo", false)
    connection:SetRequestHeader("Authorization", "Bearer " + token)
    connection:SetRequestHeader("Content-Type", "image/jpeg")   // Request Body Schema, isto muda conforme a extensão da imagem (.png ou .jpg)
    ...
    connection:SetRequestHeader("Content-Length", len( body ) )
    connection:SetRequestHeader("Content-disposition: form-data; name="arquivo1""; filename="minha-foto.jpg"
    connection:SetRequestHeader("Content-Transfer-Encoding: binary "+body )
    ...
    connection:Send() // a var body contém o binário da imagem ira no corpo do Request
    connection:WaitForResponse(5000)
    ...
Eita pitaco da hora Rocinha, acho que é isso, assim que estiver mais tranquilo vou testar essas opções que você passou, resolvendo ou não, aprendi mais opções da MSXML2. Abraços!