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

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

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

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

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

Mensagem 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.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

Em hexadecimal dobra o tamanho, em base64 não.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

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

Mensagem 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.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

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

Mensagem 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�����?������
...
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

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

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

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

Mensagem 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
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

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

Mensagem 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
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

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

Mensagem 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...
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

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

Mensagem 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)
    ...
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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á
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

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

Mensagem 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!
Nilton Medeiros
nilton@sistrom.com.br
Responder