Armazenar imagens em um .DBF.

Fórum sobre a linguagem CA-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:

Armazenar imagens em um .DBF.

Mensagem por rochinha »

Amiguinhos

Tive esta idéa a trocentos anos atraz e nunca coloquei em pratica mesmo porque na epoca não existiam os padrões .JPG e GIF somente os padrões PCX, TIFF e BMP, inimagináveis de se trabalhar pelo tamanho que ocupavam.

Hoje o que vemos é que as imagens podem ter definição extrema com tamanho super reduzido.

E o nosso sonho sempre foi este poder armazenar as fotos do funcionários junto com seus dados no .DBF.

Se tem alguma biblioteca que faz isto acho que tenha, mas em puro Clipper sei que não.

Bom sem muito falatório vejam este código e façam os testes e reparos:

Código: Selecionar todos

function IMG2MEMO( arquivo )
   bak_pont=0
   destino := L2Hex(GetTickCount())+".TMP"
   arqcria := fcreate(destino)
   arqler  := fopen( origem )
   fimarq := fseek( arqler, 0, 2 )
   for ponteiro = 0 to fimarq step 5000
        bak := space( 5000 )
        if ponteiro + 5000 > fimarq
           bak := space( fimarq - ponteiro )
        endif
        fseek( arqler, ponteiro )
        fread( arqler, @bak, len( bak ) )
        bak_pont += len( bak )
        fwrite( arqcria, bak )
   next
   fclose( arqler )
   fclose(arqcria)
   return memoread( destino )
Uso:

cImagem := IMG2MEMO( "foto.jpg" )
...
replace CAMPOMEMO with cImagem
...

Qual é o esquema? voce passa o nome da imagem que deve ter no maximo 64k( um .JPG com este tamanho possui uma definição muito boa ) que é o tamanho maximo de um campo MEMO( ja entenderam, né ).

A função fará a leitura bia-a-bit, ou byte-a-byte da imagem e a gravará em outro arquivo( na verdade basta renomear um .JPG para .TXT da na mesma ) e fará o carregamento deste para a memória o resultado pode ser salvo em uma variável e então salva em um campo memo.

Legal né, agora fica por conta de voce fazerem o inverso, pegar o conteudo do campo memo e re-transformá-lo em um .JPG, hehehe!

Acho que funciona e voces?
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
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Armazenar imagens em um .DBF.

Mensagem por Maligno »

Seu código não vai funcionar corretamente do jeito que está. A variável origem não é definida. Me parece que aí você quis dizer arquivo, que é o argumento da função. Fora isso, a variável bak_point não tem utilidade nenhuma. Faltou alguma coisa?
Mas a questão maior é: porque fazer esse tipo de cópia byte-a-byte, se seria muito mais prático simplesmente renomear o arquivo? Ou mesmo usar uma função de cópia da CATools ou alguma outra biblioteca?
Nunca usei memo antes, por isso, não tenho certeza. Mas não haveria problema armazenar códigos binários (não imprimíveis) num campo memo? Não seria mais seguro converter para UUEncode ou Base64 (protocolos de eMail)?

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Realmente deu uma fora na abertura da função.

Não sei de onde tirei aquele arquivo mas é isto mesmo.

E como disse anteriormente não sei qual biblioteca teria uma função com esta caracteristica.

e realemente o fato de renomear seria mais pratico, pois este codigo eu retirei da função de backup do MIRO que lias os arquivo e criava um só arquivo com tudo dentro.

Eu nunca cheguei a fazer um teste real, somente um unico teste e pronto. Mas a intenção foi a de plantar uma idéia não só de armazenar imagens como também pequeno arquivo .DOC etc.

Este método de transformar tipos não é inédito e é muito usado por alguns jackers para plantar um .EXE em nossas maquinas. Vi isto em um codigo em que sua função principal continha uma string con conteudo incompreensivel e em dado momento ele usava os métodos FSO para gravar este resultado no disco e renomeá-lo.

Não gosto muito de campos MEMO e agora que estou mexendo com o MySQL me deparei com um problema com os campos BLOB( que na teoria seria o mesmo que MEMO ) os quais não consegui salvar informações e/ou recuperar, até descobrir que o MySQL tem um tipo de campo TEXTo que comporta o mesmo ou até mais que 64k.

E enquanto levantava este conhecimento pude perceber que as função de gravação para este campo tanto usando o ADO( que uso ) como em PHP, fazem uso deste tipo de recurso.

Mas vou continuar pesquisando e levar em extrema consideração o que voce postou por ser de grande valia.

Valeu.
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.
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Olá,

Eu ja tentei uma vez fazer este esquema de gravar como se fosse texto em campo memo e não deu certo. Mas não insisti, deve haver alguma maneira.

Deixando de lado os detalhes técnicos, acredito que não seja conveniente aramazenar imagens em DBFs. Me lembro quando eu trabalhava com Oracle que isso era possível, no entanto estava sendo feito um grande esforço para retirar essa funcionalidade do sistema. Por menor que seja uma figura (de uns 40 kb digamos), uma tabela com mil clientes já começa a pesar desnecessariamente, sendo que 100 Kb é o tamanho de uma tabela já bem grandinha no Oracle, Mysql e afins.

Dada esta situação, imagine em DBF...

Eu já necessitei disso, e resolvi colocar um campo pro cara dizer onde estava a figura, aí vai um campinho char com o conteúdo "C:\Meus Documentos\figura.jpg". Outa forma que encontrei é apenas mandar o cara salvar a figura em determinada pasta com o nome de "Cliente00001.jpg", enfim, existem soluções menos suicidas eu acho.

Penso que não devemos "forçar a barra" tentando fazer milagres com tecnologias antigas, pois como você mesmo mencionou, nem sequer existiam os formatos atuais de imagem na época de ouro dos DBFs.

Que é legal é, mas acho que mesmo dando certo, eu não faria.

É só uma opinião...
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
Alexandre Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 376
Registrado em: 26 Mar 2007 00:16
Localização: Itapema - SC

Re: Armazenar imagens em um .DBF.

Mensagem por Alexandre Silva »

Oi..

Preciso apenas mostar uma imagem na tela de acordo com o codigo do produto
Nem precisaria armazerar em DBF, poderia estar numa pasta e eu 'carregaria e mostraria na tela' se o cliente apertasse uma tecla por exemplo
isso no clipper..
Alguma biblioteca ? ou program externo leve ??

Obrigado..
:xau
Editado pela última vez por Alexandre Silva em 07 Fev 2009 13:08, em um total de 1 vez.
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Armazenar imagens em um .DBF.

Mensagem por gvc »

Em clipper puro não dá.
Eu fiz usando a CLBC.
Vc guarda a imagem em uma pasta e no dbf vc tem o nome do arquivo.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Adalberto
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 01 Set 2007 01:09
Localização: Santa Cruz de la Sierra - Bolivia

Re: Armazenar imagens em um .DBF.

Mensagem por Adalberto »

“Em barco de outros”.

He possível mostrar na tela uma imagem pequena, dentro da tela em modo consola?, a FastGt.Lib pode mais não trabalha em modo protegido. Senhores podem me ajudar?

Muito obrigado a todos.

Um grande abraço
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Armazenar imagens em um .DBF.

Mensagem por Pablo César »

Adalberto escreveu:É possível mostrar na tela uma imagem pequena, dentro da tela em modo console ?
Na minha opinião, quanto refere-se a exibição de imagens (fotos por exemplo), nunca é em modo console e sim em modo gráfico.
Adalberto escreveu:a FastGt.Lib pode, mas não trabalha em modo protegido. Senhores podem me ajudar ?
Adalberto, eu acho que devemos esquecer de trabalhar em Clipper para exibir fotos, pois todo aplicativo em Clipper que não esteja em modo gráfico, fica impossível de ser exibido com a mesma nitidez que teria em modo gráfico. Eu por exemplo faço para exibir uma foto através de outro aplicativo que de dentro da minha aplicação em modo console é chamado em outra sessão. Claro que esse aplicativo é GUI.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
vailton
Colaborador
Colaborador
Mensagens: 390
Registrado em: 17 Nov 2005 19:08
Localização: Brasil
Contato:

Re: Armazenar imagens em um .DBF.

Mensagem por vailton »

Já vi isto na CLBC com Clipper puro... exibia uma foto em PCX do usuario logado. Mas não sei como o programador fez para exibir isto. Ha alguns anos atrás eu esbocei umas rotinas para a falecida BRGUI que guardava imagens em campos memo. O unico problema ao fazer isto é o CHR(26) que na epoca eu tratei assim:

Código: Selecionar todos

*
* O Pulo-do-gato para armazenar imagens
* em arquivos DBF utilizando campos DBT
*
*     by Vailton Renato - 30/07/2004 = 22:32hs
*
function MaskBinData(x)
      x := StrTran(x,chr(26),'\\#26//')
      x := StrTran(x,chr(00),'\\#00//')
   return x

function UnMaskBinData(x)
      x := StrTran(x,'\\#26//',chr(26))
      x := StrTran(x,'\\#00//',chr(00))
   return x
Só que hj eu acho q o codigo nao é o melhor de todos, mas funciona para o problema de guardar aquivos no DBF, para usar (se for usar) faça assim:

Código: Selecionar todos

** Para armazenar:
replace FOTO with MaskBinData( Memoread( "arquivo.bmp" ))

** Para rescatar o valor:
MemoWrit( "temp.bmp", UnMaskBinData( FOTO ) )
Espero que possa ajudar.
Vailton Renato
"No dia mais claro, na noite mais escura... o bug sucumbirá ante a minha presença"

E-mail/MSN: contato@vailton.com.br
Skype: vailtom
Responder