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: 4666
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Curtiu: 1 vez
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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 4666
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Curtiu: 1 vez
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: 4666
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Curtiu: 1 vez
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: 4666
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Curtiu: 1 vez
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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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